acwing 1381. 阶乘

1381. 阶乘

 

 

思路:要求N!的最右边非零的数,需要将N!最末尾的k个零移除后模10

   如何求k的值? 将 i (1, 2, 3...N) mod 2和5,直至无法分别整除,

   计算出2的个数α,5的个数β,取k = min(α,β),即最多有k个0。

   将X 乘以每个剩下的值 i,随后分别乘以(α - k)个2,(β - k)个5,

   同时取mod 10,因为 x * y mod b = (x % b) * (y mod b);

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n, res = 1, d2 = 0, d5 = 0;
 7     cin >> n;
 8     for (int i = 1; i <= n; i ++)
 9     {
10         int x = i;
11         while (x % 2 == 0) x /= 2, d2 ++;
12         while (x % 5 == 0) x /= 5, d5 ++;
13         res = res * x % 10;
14     }
15     int k = min(d2, d5);
16     for (int i = 0; i < d2 - k; i ++) res = res * 2 % 10;
17     for (int i = 0; i < d5 - k; i ++) res = res * 5 % 10;
18     cout << res << endl;
19     return 0;
20 }

 

posted @ 2021-01-25 20:34  。啊这  阅读(73)  评论(0)    收藏  举报