The factorial function, n! is defined thus for n a non-negative integer:
0! = 1
n! = n * (n-1)! (n > 0) We say that a divides b if there exists an integer k such that
k*a = b The input to your program consists of several lines, each containing two non-negative integers, n and m, both less than 2^31. For each input line, output a line stating whether or not m divides n!, in the format shown below.
Sample Input
6 9
6 27
20 10000
20 100000
1000 1009
Output for Sample Input
9 divides 6!
27 does not divide 6!
10000 divides 20!
100000 does not divide 20!
1009 does not divide 1000!
对于任意质数p,n!中有(n/p+n/p^2+n/p^3+...)个质因子p。
#include#include#include#includeusing namespace std;int prime[50000],is[50000];int pl;int a[50000],cnt[50000];//对于任意质数p,n!中有(n/p+n/p^2+n/p^3+...)个质因子p。int countc(int n,int p){ int ans=0; while(n/p) { ans+=n/p; n/=p; } return ans;}int main(){ for(int i=2;i<50000;i++) { if(is[i]==0) prime[pl++]=i; for(int j=0;j>n>>m) { if(m==0) {printf("%d does not divide %d!/n",m,n);continue;} if(n>=m) {printf("%d divides %d!/n",m,n);continue;} int mm=m; double k=sqrt(m); int num=0; memset(cnt,0,sizeof(cnt)); for(int i=0;prime[i]<=k;i++) { if(m%prime[i]==0) { a[num]=prime[i]; while(m%prime[i]==0) { cnt[num]++; m/=prime[i]; } num++; } } if(m>1) a[num]=m,cnt[num++]=1; int flag=1; for(int i=0;i