题意:判断m能否整除n!
题解:0特判,其他情况对m分解质因数并统计个数,看n!是否含多余该个数的质因数,n!关于质因数p的个数=(n/p+n/p^2+n/p^3......),即求出mod p=0,mod p^2=0等的个数。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 const int mr=65536; 7 bool notp[mr]; 8 int pr[mr]; 9 int pn; 10 void getpri()//筛素数 11 { 12 pn=0; 13 memset(notp,0,sizeof(notp)); 14 for(int i=2; i<mr; i++) 15 { 16 if(!notp[i]) 17 { 18 pr[pn++]=i; 19 } 20 for(int j=0; j<pn && i*pr[j]<mr; j++) 21 { 22 int k=i*pr[j]; 23 notp[k]=1; 24 if(i%pr[j]==0) 25 break; 26 } 27 } 28 } 29 int fac[1000],num[1000],top; 30 void div(int n) 31 { 32 for(int i=0,tp;i<pn&&pr[i]*pr[i]<=n;i++) 33 { 34 if(n%pr[i]==0) 35 { 36 num[top]=0; 37 tp=fac[top]=pr[i]; 38 while(n%tp==0) 39 { 40 n/=tp; 41 num[top]++; 42 } 43 top++; 44 } 45 } 46 if(n>1) 47 num[top]=1,fac[top++]=n; 48 } 49 int main() 50 { 51 getpri(); 52 int n,m; 53 while(scanf("%d%d",&n,&m)!=EOF) 54 { 55 if(m==0) 56 { 57 printf("%d does not divide %d!\n",m,n); 58 continue; 59 } 60 else if(m<=n||m==1) 61 { 62 printf("%d divides %d!\n",m,n); 63 continue; 64 } 65 top=0; 66 div(m); 67 bool flag=true; 68 for(int i=0;i<top;i++) 69 { 70 int t=num[i],p=fac[i],po=p; 71 while(t>0&&po<=n&&po>0) 72 { 73 t-=n/po; 74 po*=p; 75 } 76 if(t>0) 77 { 78 flag=false; 79 break; 80 } 81 } 82 if(flag) 83 printf("%d divides %d!\n",m,n); 84 else 85 printf("%d does not divide %d!\n",m,n); 86 } 87 return 0; 88 }