hdu 3826

来源:互联网 发布:淘宝店铺专业版收费吗 编辑:程序博客网 时间:2024/05/05 03:41

题目: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.00001int 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;}


原创粉丝点击