VJudge CodeForcces

算法

  • 数学(质因数分解,因数个数,进制)

思路

根据进制的知识,对于 kk 进制而言,只有当 nmodki=0n \bmod k^{i} = 0 时,kk 进制意义下的第 ii 位才会为零。
由于 k1012k \le 10^{12},所以直接进行除法操作肯定不行,考虑将 kk 质因数分解,对于 kk 的每一个质因数分别考虑。设 k=i=0spiαIk = \prod_{i = 0}^{s} p_{i}^{\alpha_{I}}n!=i=0spiβin! = \prod_{i = 0}^{s} p_{i}^{\beta_i}。则 n!n!kk 进制下末尾 00 的个数为 mini=0sβiαi\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;
}