根据进制的知识,对于 k 进制而言,只有当 nmodki=0 时,k 进制意义下的第 i 位才会为零。
由于 k≤1012,所以直接进行除法操作肯定不行,考虑将 k 质因数分解,对于 k 的每一个质因数分别考虑。设 k=∏i=0spiαI,n!=∏i=0spiβi。则 n! 在 k 进制下末尾 0 的个数为 mini=0s⌊αiβi⌋ 。
代码
#include<bits/stdc++.h>
usingnamespace std;
constint N = 1e6 + 5; longlong divide[N][2]; int cnt = 0;
inlinelonglongcal(longlong a, longlong b){ if (a < b) return0; elsereturn a / b + cal(a / b, b); }
intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); longlong n, k; cin >> n >> k; longlong answer = 1ll << 62; // ! 注意枚举上界为 sqrt(k) 而不是 k for (longlong i = 2; i * i <= k; i ++) { if (k % i == 0) { longlong alpha = 0; while (k % i == 0) { k /= i; alpha ++; } divide[++ cnt][0] = i; divide[cnt][1] = alpha; } } if (k > 1) { divide[++ cnt][0] = k; divide[cnt][1] = 1; } for (int i = 1; i <= cnt; i++) { longlong p = divide[i][0], alpha = divide[i][1], beta = cal(n, p); answer = min(answer, beta / alpha); } cout << answer << '\n'; return0; }