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
", ans);
return 0;
}