1926: Factovisors
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
![]() | 3s | 8192K | 659 | 122 | Standard |
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 = bThe 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<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using 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<pl&&prime[j]*i<50000;j++)
{
is[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
int n,m;
while(cin>>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<num;i++)
{
if(countc(n,a[i])<cnt[i])
{
flag=0;
break;
}
}
if(flag) printf("%d divides %d!/n",mm,n);
else printf("%d does not divide %d!/n",mm,n);
}
return 0;
}