n!=n*(n-1)*(n-2)...*3*2
a^k=a*a*a...*a
1.把2~n进行质因数分解
2.把a进行质因数分解
3.看把2~n分解的质因数里包含多少倍的a的质因数
#include "stdio.h" #include "string.h" #include "limits.h" int isPrime(int n){//质数判定 if(n<=1){ return 0; } for (int i = 2; i*i <=n ; ++i) { if(n%i==0){ return 0; } } return 1; } const int MAXN=1000+10; int A[MAXN]; int P[MAXN]; int Init(){//求质数的筛法 int index=0; memset(A,1,sizeof (int)*MAXN); A[0]=A[1]=0; for(int i=2;i<MAXN;i++){ if(!isPrime(i)){ continue; } P[index++]=i; if(i>MAXN/i){ continue; } for(int j=i*i;j<MAXN;j+=i){ A[j]=0; } } return index; } int N_arr[MAXN]; int A_arr[MAXN]; void decompose_N(int n,int p_len){ for(int i=0;i<p_len;i++){ int temp=P[i]; while (n%temp==0){ N_arr[temp]++; n/=temp; } } } void decompose_A(int n,int p_len){ for(int i=0;i<p_len;i++){ int temp=P[i]; while (n%temp==0){ A_arr[temp]++; n/=temp; } } } int main() { int n,a; int p_len=Init(); while (scanf("%d%d",&n,&a)!=EOF){ memset(N_arr,0,sizeof (int)*MAXN); memset(A_arr,0,sizeof (int)*MAXN); decompose_A(a,p_len);//把a进行质因数分解 for(int i=2;i<=n;i++){//把2~n进行质因数分解 decompose_N(i,p_len); } int k=INT_MAX; for(int i=2;i<a;i++){//看把2~n分解的质因数中包含多少(倍的)a的质因数 if(N_arr[i]!=0&&A_arr[i]!=0){ if(N_arr[i]/A_arr[i]<k){ k=N_arr[i]/A_arr[i]; } } } printf("%d\n",k); } return 0; }