这个题大意是说给你2个数n,m,要求你判断n!是否可以乘除m。
我的解法是对m进行因式分解,每次都是判断n的阶乘是否同样存在这样的因式,然后注意素数上界判断的问题,以及对0的特殊处理。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10e5+1;
bool isPri[maxn];
int Pri[100001],cou=0,n,m;
void Init()
{
isPri[1]=1;
for(int i=2;i<maxn;i++)
{
if(!isPri[i])
Pri[cou++]=i;
for(int j=2;i*j<maxn;j++)
isPri[i*j]=1;
}
}
bool Search(int num,int count)
{
int cou=0;
for(int i=num;i<=n;i++)
{
int ita=i;
while(ita%num==0)
{
ita/=num;
cou++;
}
if(cou==count)
return true;
}
return false;
}
int main()
{
Init();
while(scanf("%d%d",&n,&m)!=EOF)
{
bool ans=1;
int mm=m,now=0;
if(m==0)
{
printf("0 does not divide %d!\n",n);
continue;
}
if(m<=n)
{
printf("%d divides %d!\n",m,n);
continue;
}
while(now<cou)
{
int num=0;
while(mm%Pri[now]==0)
{
mm/=Pri[now];
num++;
}
if(num)
{
if(!Search(Pri[now],num))
{
ans=0;
break;
}
}
if(mm==1)
break;
now++;
}
if(ans&&mm<=n)
printf("%d divides %d!\n",m,n);
else
printf("%d does not divide %d!\n",m,n);
}
return 0;
}