AcWing 1381. 阶乘

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

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

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

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

输入格式

共一行,包含一个整数 N。

输出格式

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

数据范围

1≤N≤1000

输入样例:

7

输出样例:

4

思路 :统计2和5因子产生的数量(2*5会产生尾数为0),我这里偷懒~~,没统计所有的2的个数

#include<iostream>
#include<memory.h>
using namespace std;
int c[1010];
int n,res;
int mod=10;
void qmod(int a,int b){
    if(b==0) return ;
    if(b&1){
        res=(res*a)%mod;b-=1;
    }else{
        a=(a*a)%mod;b/=2;
    }
    qmod(a,b);
}
int main(){
    cin>>n;
    memset(c,0,sizeof c);
    for(int i=1;i<=n;i++){
        if(i%5==0){                  //遇到能整除5的数不断分解统计5的个数
          int temp=i,cnt=0;
            while(temp%5==0 ){
                temp/=5;
                cnt++;
            }
            c[5]+=cnt;
            c[temp]++;
        }else{
           if(i%2==0){               //遇到能整除2的数直接c[2]++;c[i/2]++;(偷懒ing)
               c[i/2]++; c[2]++;
           }else{
               c[i]++;
           }
        }
    }
    int ans=1;
    c[2]=c[2]-c[5];                 
    c[5]=0;
    for(int i=2;i<=n;i++){
        res=1;
        qmod(i,c[i]);
        ans=(ans*res)%10;
    }
    cout<<ans%10;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wd2ctp88/article/details/113099400