思路

首先暴力求出来 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;
}