AcWing寒假每日一题——Day16阶乘

阶乘

N N N 的阶乘(记作 N ! N! N!)是指从 1 1 1 N N N(包括 1 1 1 N N N)的所有整数的乘积。

阶乘运算的结果往往都非常的大。

现在,给定数字 N N N,请你求出 N ! N! N! 的最右边的非零数字是多少。

例如 5 ! = 1 × 2 × 3 × 4 × 5 = 120 5!=1×2×3×4×5=120 5!=1×2×3×4×5=120,所以 5 ! 5! 5! 的最右边的非零数字是 2 2 2

输入格式
共一行,包含一个整数 N N N

输出格式
输出一个整数,表示 N ! N! N! 的最右边的非零数字。

数据范围
1 ≤ N ≤ 1000 1≤N≤1000 1N1000
输入样例:

7 7 7

输出样例:

4 4 4

分析: 要去掉末尾所有的 0 0 0,必须找出 N ! N! N!所有 2 2 2的个数和 5 5 5的个数最后 m o d 10 mod10 mod10。设答案为 N ! 1 0 k m o d 10 \frac{N!}{10^k} mod 10 10kN!mod10
k k k为末尾 0 0 0的个数。则有: 2 α − k ⋅ 2 β − k ⋅ P 1 a 1 ⋅ P 2 a 2 ⋅ ⋅ ⋅ P n a n m o d 10 2^{\alpha-k }·2^{\beta-k}·P_1^{a_1}·P_2^{a_2}···P_n^{a_n}mod 10 2αk2βkP1a1P2a2Pnanmod10
α 、 β \alpha、\beta αβ 2 2 2的个数和 5 5 5的个数。
那么只要找出 2 2 2 5 5 5的因子个数取 m i n min min就是 k k k,最后可以得到答案。

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
    int n,res=1,d2=0,d5=0,k;
    cin>>n;
    for(int i=1;i<=n;i++){
    
    
        int x=i;
        while(x%2==0) x/=2,d2++;
        while(x%5==0) x/=5,d5++;
        res=res*x%10;
    }
    k=min(d2,d5);
    for(int i=0;i<d2-k;i++) res=res*2%10;
    for(int i=0;i<d5-k;i++) res=res*5%10;
    cout<<res%10<<endl;
}

猜你喜欢

转载自blog.csdn.net/messywind/article/details/113096043