P1134 阶乘问题
P1134 阶乘问题
题意 : 求出 \(n!\) 去掉后导 \(0\) 之后的最后一位
Solution
首先后导 \(0\) 最简单是由 \(2 * 5\) 得来的
于是想到一个骚操作, 先把每个数的 \(2, 5\) 提出来, 一对一对地消掉, 就把后导 \(0\) 去掉了
因为在 \(1-n\) 中因子 \(2\) 一定比 \(5\) 多, 所以最后让 2 的个数减去 5 的个数
然后对于剩下的 \(2\) 不想写快速幂
发现只用保留最后一位, 然后最后一位以 \(4\) 为周期反复
于是就 \(A\) 了
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
typedef long long LL;
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
int n, ans = 1;
int num5, num2;
int change(int x){
while(x % 5 == 0)num5++, x /= 5;
while(x % 2 == 0)num2++, x /= 2;
return x;
}
int last[4] = {6, 2, 4, 8};
int main(){
n = RD();
for(int i = 1;i <= n;i++){
ans = (ans * change(i)) % 10;
}
num2 -= num5;
ans = (ans * (last[num2 % 4])) % 10;
printf("%d\n", ans);
return 0;
}