acwing 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 }

浙公网安备 33010602011771号