题目:http://acm.hdu.edu.cn/showproblem.php?pid=3826
算法分析:
对于2-10^18的任意一个数 都能转化成如下的形式 ……等等 a,b,c,d都是质数
然后
情况1 将输入的num 先从 2-10^6中的质数进行相除,有一个质数能连出两次以上 就输出no
情况2 如果能整除 num=num/i 然后 如果 相除后num==1 输出yes
进行完一二操作后 本题中剩下的num这个数 (因为不存在1-10^6的质数) 最多只有两个质数
情况3 只有两种结果 两个10^6-10^9 的质数相乘 或者只有一个质数 在10^6-10^18次方之间。 这样只要判断第一种结果是否是两个相同质数相乘的情况了~~
#include<stdio.h>
#include<math.h>
#include<string.h>
#define M 1100000
#define MIN 0.00001
int a[M],b[500000],flag;
int init()
{
int i,j;
memset(a,0,sizeof(a));
for(i=2;i*i<=M;i++)
{
if(!a[i])
{
for(j=i*2;j<=M;j=j+i)
{
a[j]=1;
}
}
}
j=1;
for(i=2;i<=M;i++)
{
if(!a[i])
{
b[j]=i;
j++;
}
}
return j;
}
void pd(double nu)
{
double a;
a=sqrt(nu);
if(a-floor(a)<=MIN)
flag=0;
else
flag=1;
}
int main()
{
int n;
scanf("%d",&n);
int cs=0;
int len=init();
//printf("%d\n",len);
while(n--)
{
cs++;
__int64 num;
int i;
scanf("%I64d",&num);
flag=0;
for(i=1;i<len;i++)
{
int sum=0;
while(num%b[i]==0)
{
num/=b[i];
sum++;
}
if(sum>=2)
{
flag=1;
break;
}
}
if(flag==1)
{printf("Case %d: No\n",cs);continue;}
if(num==1)
{printf("Case %d: Yes\n",cs);continue;}
pd((double)num);
if(flag==0)
printf("Case %d: No\n",cs);
else
printf("Case %d: Yes\n",cs);
}
return 0;
}