P1134 [USACO3.2]阶乘问题
考察:唯一分解定理
这题不会,果然我是不配学OI的
思路:
易知只有当阶乘出现了2和5才能有一个0, 由唯一分解定理 n! = 2a3b5c....,当我们把n!的2和5的共同凑成10的因子全部除去后,再%10就能得到答案.这个答案为 2a-min(a,c)%10*5c-min(a,c)%10*其他因子%10
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 int cnt1,cnt2; 6 int qsm(int x,int k,int q) 7 { 8 int res = 1; 9 while(k) 10 { 11 if(k&1) res = (long long)res*x%q; 12 k>>=1; 13 x = (long long)x*x%q; 14 } 15 return res; 16 } 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 int res = 1; 22 for(int i=1;i<=n;i++) 23 { 24 int x = i; 25 while(x%2==0) x/=2,cnt1++; 26 while(x%5==0) x/=5,cnt2++; 27 res= res*x%10; 28 } 29 int ans1 = qsm(2,cnt1-cnt2,10); 30 printf("%d\n",ans1*res%10); 31 return 0; 32 }