CodeForces 1114C
算法
- 数学(质因数分解,因数个数,进制)
思路
根据进制的知识,对于 \(k\) 进制而言,只有当 \(n \bmod k^{i} = 0\) 时,\(k\) 进制意义下的第 \(i\) 位才会为零。
由于 \(k \le 10^{12}\),所以直接进行除法操作肯定不行,考虑将 \(k\) 质因数分解,对于 \(k\) 的每一个质因数分别考虑。设 \(k = \prod_{i = 0}^{s} p_{i}^{\alpha_{I}}\),\(n! = \prod_{i = 0}^{s} p_{i}^{\beta_i}\)。则 \(n!\) 在 \(k\) 进制下末尾 \(0\) 的个数为 \(\min_{i=0}^{s} \lfloor \frac{\beta_i}{\alpha_i} \rfloor\) 。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
long long divide[N][2];
int cnt = 0;
inline long long cal(long long a, long long b) {
if (a < b) return 0;
else return a / b + cal(a / b, b);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
long long n, k;
cin >> n >> k;
long long answer = 1ll << 62;
// ! 注意枚举上界为 sqrt(k) 而不是 k
for (long long i = 2; i * i <= k; i ++) {
if (k % i == 0) {
long long 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++) {
long long p = divide[i][0], alpha = divide[i][1], beta = cal(n, p);
answer = min(answer, beta / alpha);
}
cout << answer << '\n';
return 0;
}
本文来自博客园,作者:Fallen_Leaf,转载请注明原文链接:https://www.cnblogs.com/FallenLeaf/p/18978435