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 }

 

posted @ 2021-02-23 11:43  acmloser  阅读(121)  评论(0编辑  收藏  举报