思路
首先暴力求出来 n 的阶乘肯定不行,那么我们可以把 a 给拆分成若干个质因子之积,然后看下 2 ~ n 中包含多少个对应的质因子,就能得出来最多可以整除 a 的多少次方。
比如 a 中有质因子 、
、
,2 ~ n 中有对应的质因子
、
... 个,那 k 的最大值也就是若干个 num 的最小值。
大致思路其实很简单,但是细节是需要注意的,比如 a = 2 * 2,有两个 2,我们不仅要统计质因数,还要统计质因数的个数。
#include<iostream>
#include<vector>
using namespace std;
//统计 num 中的质因子数
void getPrime(vector<int>& factors, int num){
for(int i = 2; i*i <= num; i ++){
while(num % i == 0){
factors[i] ++;
num /= i;
if(num <= 1) return;
}
}
if(num > 1) factors[num] ++;
}
int main(){
int n, a;
while(cin >> n >> a){
vector<int> factor_a(1000), factor_n(1000);
getPrime(factor_a, a);
for(int i = 2; i <= n; i ++)
getPrime(factor_n, i);
int k = 1000;
for(int i = 2; i <= a; i ++){
if(factor_a[i]) k = min(k, factor_n[i]/factor_a[i]);
}
cout << k << endl;
}
return 0;
} 
京公网安备 11010502036488号