题意为:给你一个数n,问n是否能被他的一个因子的平方整除,能则输出no,否则yes。
n可以写成质数乘积的形式,
因为n<=10的18次方,所以只需把10的6次方之前的素数遍历即可,
n=n/p;p为质数。
假如余数n=p1^2*p2,若p1^2大于10的6次方p2小于10的6次方,
所以只需看余数是否能被开方。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define maxn 1000020
int prime[maxn],vis[maxn];
__int64 top,n;
void fun()
{
for(int i=2;i*i<maxn;i++)
if(vis[i]==0)
for(int j=i+i;j<maxn;j+=i)
vis[j]=1;
top=0;
for(int i=2;i<=1000000;i++)
if(vis[i]==0)
prime[top++]=i;
}
bool test(__int64 j)
{
for(int i=0;i<j;i++)
{
if(n%prime[i]==0)
{
n/=prime[i];
if(n%prime[i]==0) return false;
}
}
return true;
}
int main()
{
int ncase;
int tt=1;
fun();
scanf("%d",&ncase);
while(ncase--)
{
scanf("%I64d",&n);
int flag=0;
printf("Case %d: ",tt++);
if(!test(top))
{
flag=1;
}
if(n>1000000)
{
double tmp=sqrt(double(n));
if(floor(tmp+0.5)==tmp) flag=1;
}
if(flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}