1 条题解
-
0
刚看这道题我把数据范围看成了10100于是欢乐地写了个暴力爆了0
完了去学习了一点姿势
进入正题
我们想,100个数字,我们需要想个奇妙的方法,比如logn的
我们考虑给要乘起来的n个数字每20个分成一组
然后我们就考虑每一组都把2和5成对去掉,能去4组
之后把原先是5的倍数去掉了5剩下的数放着不管,每组其他的数乘完了尾数就是6
而原先是5的倍数的数,都除以5之后就是1到n/5了....
我们用foo(x)表示x!的尾数,易证foo(x)=foo(x+20)
那么由上面有foo(n)=6^(n/20)*foo(n/5)*foo(n%20)
注意到6的几次方尾数都是6
于是就可以愉快地递归计算了
注意字符串读入,记得搞高精
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int N=128; const int f[32]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2}; char s[N]; int a[N]; int main(){ int t=5; int n,k,ass; while(t--){ ass=1; scanf("%s",s); n=strlen(s); for(int i=0;i<n;i++)a[n-i-1]=s[i]-'0'; while(n>1){ while(a[n-1]==0)n--; ass=ass*f[a[1]%2*10+a[0]]%10; int tp=0; for(int i=n-1;i>=0;i--){ tp=tp*10+a[i]; a[i]=tp/5; tp%=5; } } printf("%d\n",ass*f[a[0]]%10); } return 0; }
- 1
信息
- ID
- 10498
- 时间
- 1000ms
- 内存
- 8MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者