// 思路:线性筛选质因数,即任意正整数(n,a>1)都可以被分解为有限个质数之积 // 如:12 = 2^2 * 3 // map可以用下标访问,而set不行 #include <bits/stdc++.h> using namespace std; #define INF 0x7fffffff // 统计num中质因子的数量 void getAllFacs(unordered_map<int, int>& fac_n, int num) { for (int i = 2; i <= sqrt(num);i++) { // 上界有等号 if (num <= 1) return; while (num % i == 0) { // num = faci^n * facj^m * ...?: 质因子分解方法 fac_n[i]++; num /= i; } } if (num > 1) fac_n[num]++; } int main() { int n, a, k = INF; cin >> n >> a; unordered_map<int, int> fac_2toN, fac_a; // 散列表存储质因数 getAllFacs(fac_a, a); // 对a分解质因数 for (int i = 2; i <= n; i++) getAllFacs(fac_2toN, i); // 对2~n分解质因数 for (int i = 2; i <= a; i++) { // 开始比较质因子次方 选出做小的作为 k if (fac_a[i] != 0) { if(fac_2toN[i]/fac_a[i] < k) k=fac_2toN[i]/fac_a[i]; } } cout << k << endl; return 0; }