hdu 3826

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值