#include <bits/stdc++.h>
using namespace std;
int n, a;
map<int, int> reca;
map<int, int> recn;
int main() {
// 打印素数表 欧拉筛 打印到1000以内够用了
bool flag[1001];
for (int i = 2; i <= 1000; i++)
flag[i] = true;
for (int i = 2; i <= 1000; i++) {
if (flag[i]) {
// 按照步长为i筛选
for (int j = i + 1; j <= 1000; j = j + i) {
if (j % i == 0)
flag[j] = false;
}
}
}
cin >> n >> a;
for (int i = 2; i <= (int)(sqrt(a)); i++) {
if (flag[i] && (a % i == 0)) {
reca[i] = 0;
while (a % i == 0) {
a /= i;
reca[i]++;
}
}
}
if (a > 1) reca[a] = 1; // 剩下一个大于sqrt(n)的质因子
for (int i = 2; i <= n; i++) {
if (flag[i]) {
recn[i] = 0;
int t = n;
while (t) {
recn[i] += t / i;
t /= i;
}
}
}
int rec = INT_MAX, k;
for (auto it = reca.begin(); it != reca.end(); it++) {
k = recn[it->first] / it->second;
rec = min(rec, k);
}
cout << rec << endl;
return 0;
}
整体的思路是质因数分解,对于a可以使用常规分解,对于n!使用勒让德定理进行计算,最好先打印一个素数表(欧拉筛)

京公网安备 11010502036488号