#include <algorithm>
#include <iostream>
#include <limits>
#include <map>
#include <vector>
using namespace std;
int n, a;
bool flag[1001];
vector<int> prime;
map<int, int> prime_n;
map<int, int> prime_a;
void get_prime() { // 1到1000所有质数
fill(flag, flag + 1001, true);
flag[0] = false;
flag[1] = false;
for (int i = 2; i <= 1000; i++) {
if (flag[i]) {
for (int j = i * i; j <= 1000; j = j + i) {
flag[j] = false;
}
prime.push_back(i);
}
}
}
void get_prime_n() { // 快速分解n!的质因数及其个数
int temp = n;
for (int i = 0; i < prime.size() && prime[i] <= n; i++) {
int ans = 0;
while (n / prime[i] >= 1) {
n = n / prime[i];
ans += n;
}
if (ans > 0) prime_n[prime[i]] = ans;
n = temp;
}
}
void get_prime_a() { // a的质因数及其个数
for (int i = 0; i < prime.size() && prime[i] <= a; i++) {
int ans = 0;
while (a % prime[i] == 0) {
a = a / prime[i];
ans++;
}
if (ans > 0) prime_a[prime[i]] = ans;
}
}
//计算结果
int calculate() {
int ans = numeric_limits<int>::max();
for (auto &e : prime_a) {
ans = min(ans, prime_n[e.first] / e.second);
}
return ans;
}
int main() {
get_prime();
cin >> n >> a;
get_prime_n();
get_prime_a();
cout << calculate() << endl;
return 0;
}
整除问题
最新推荐文章于 2021-08-29 22:47:07 发布