题目链接:
题目:
2 30 75
Case 1: Yes Case 2: No
因为数的范围为10的18次方,那么它的因子必须是小于10的6次方的,则n*n*n>10的18次方,所以打一个1000000的素数表,
首先是素数表,用筛法打素数表。复杂度为O(ologn),应该是目前来说最快的吧。。
如果一个数在整除素数1000000后任然大于10的6次方的话,则将其开方后再乘。详情参见小白178面。
有个非常详细的讲解的。
传送门 讲的非常好。。
我的代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
const int maxn=80000+10;
const int n=1000000;
int prime[maxn],vis[n];
__int64 N;
int pos;
int init()
{
int c=0;
int m;
memset(vis,0,sizeof(vis));
m=sqrt(n+0.5);
for(int i=2;i<=m;i++)
{
if(!vis[i])
{
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
}
}
for(int i=2;i<=n;i++)
{
if(!vis[i])
prime[c++]=i;
}
return c;
}
int judge()
{
for(int i=0;i<pos;i++)
{
while(N%prime[i]==0)
{
N=N/prime[i];
if(N%prime[i]==0)
return 0;
}
}
return 1;
}
int main()
{
__int64 x;
int i,t,cas=1,ok;
pos=init();
scanf("%d",&t);
while(t--)
{
ok=1;
scanf("%I64d",&N);
if(!judge())
ok=0;
if(N>1000000)
{
x=(int)sqrt(double(N));
if(x*x==N)
ok=0;
}
if(ok)
printf("Case %d: Yes\n",cas++);
else
printf("Case %d: No\n",cas++);
}
return 0;
}hdu3826 Squarefree number,布布扣,bubuko.com
原文:http://blog.csdn.net/u014303647/article/details/35890027