先把m分解成质因数,记录下m的每个质因数在m中的个数。然后遍历1至n的每个数,对m的每个质因数分别判断包含多少个,并对这些数累加。
单独考虑每个质因数,质因数在1到n中的数量/在m中的数量,是理论上m考虑这个质因数的最大值。那么遍历所有质因数,这个值的最小值就是答案。
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #include <algorithm> #include <vector> int a[5005]; int dnum[5005]; int main(){ int T; cin>>T; int kase=1; while(T--){ int m,n; scanf("%d%d",&m,&n); vector <int > d; memset(a,0,sizeof(a)); memset(dnum,0,sizeof(dnum)); int tmp=m; for(int i=2;i<=m;i++){ if(tmp%i==0) d.push_back(i); while(tmp%i==0){ dnum[i]++; tmp/=i; } } for(int i=2;i<=n;i++){ for(int j=0;j<d.size();j++){ int t=i; while(t%d[j]==0){ a[d[j]]++; t/=d[j]; } } } int res=10000000; for(int i=0;i<d.size();i++){ res=min(res,a[d[i]]/dnum[d[i]]); } printf("Case %d:\n",kase++); if(res==0){ printf("Impossible to divide\n"); } else{ printf("%d\n",res); } } return 0; }