题目地址:
或者:http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110704&format=html
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define INF 0xfffffff
using namespace std;
int MOD;
int prime[20000];
int flag[100010];
long long q;
void init()
{
memset(flag,0,sizeof(flag)); //筛选求素数,只求1—sqrt(2^31)内的就可以。
long long i,j;
q=0;
for(i=2;i<100005;i++)
{
if(flag[i]) continue;
prime[q++]=i;
for(j=i*i;j<100005;j+=i) //在这j=i*i可能会越界奥,最好还是用long long
flag[j]=1;
}
}
int main()
{
int i,j,k,t;
long long m,n,gg;
init();
int num,count,mid;
while(cin>>n>>m)
{
gg=m;
if(m==0||(n==0&&m>1))
{
cout<<m<<" does not divide "<<n<<"!"<<endl;//特殊情况特判
continue;
}
if(m<=n)
{
cout<<gg<<" divides "<<n<<"!"<<endl;
continue;
}
int sign=0;
for(i=0;prime[i]<=m&&m>1&&i<q;i++)
{
count=0;
if(m%prime[i]==0)
{
mid=prime[i];
count++;
m/=mid;
while(m%mid==0)
{
count++;
m/=mid;
}
num=0;
while(mid<=n)
{
num+=(n/mid),mid*=prime[i]; //求阶乘下的素因子个数,有公式的
if(num>=count) break;
}
if(num<count)
{
sign=1;
break;
}
}
}
if(sign)
{
cout<<gg<<" does not divide "<<n<<"!"<<endl;
continue;
}
if(m>1) //若m大于1,则这个数一定是素数,即原来的m含有这个素因子。
{
if(m<=n) cout<<gg<<" divides "<<n<<"!"<<endl;
else cout<<gg<<" does not divide "<<n<<"!"<<endl;
}
else if(!sign) cout<<gg<<" divides "<<n<<"!"<<endl;
}
return 0;
}