zoukankan      html  css  js  c++  java
  • hdu 3826

    Squarefree number

    Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1984    Accepted Submission(s): 526


    Problem Description
    In mathematics, a squarefree number is one which is divisible by no perfect squares, except 1. For example, 10 is square-free but 18 is not, as it is divisible by 9 = 3^2. Now you need to determine whether an integer is squarefree or not.
     
    Input
    The first line contains an integer T indicating the number of test cases.
    For each test case, there is a single line contains an integer N.

    Technical Specification

    1. 1 <= T <= 20
    2. 2 <= N <= 10^18
     
    Output
    For each test case, output the case number first. Then output "Yes" if N is squarefree, "No" otherwise.
     
    Sample Input
    2
    30
    75
     
    Sample Output
    Case 1: Yes
    Case 2: No
     
    Author
    hanshuai
    采用如果素因子超过2次,NO。这个很好理解。
    这样还是会超时。10^18次方,最坏的情况下10^9次方。
    但是,我们只需要枚举10^6内的素数就可以。为什么?
     
    假如n 有(10^6,10^9)的一个素因子平方构成 ,不在10^6范围,但是可能直接开方判断即可。
    还有假如是(10^,10^9)的一个素因子平方*a构成,则a必在10^6内。不然数字就超过10^18次方了。
    我们用[1,10^6]内的素数,刷一遍的时候,就可能除去a,然后又可以开方,直接判断就行。
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<math.h>
     6 using namespace std;
     7 typedef __int64 LL;
     8 
     9 bool s[1000002];
    10 LL prime[78500],len;
    11 void init()
    12 {
    13     int i,j;
    14     len=0;
    15     memset(s,false,sizeof(s));
    16     for(i=2;i<=1000000;i++)
    17     {
    18         if(s[i]==true)continue;
    19         prime[++len]=i;
    20         for(j=i*2;j<=1000000;j=j+i)
    21             s[j]=true;
    22     }
    23 }
    24 LL Euler(LL n)
    25 {
    26     LL i,num;
    27     for(i=1;prime[i]*prime[i]<=n && i<=len;i++)
    28     {
    29         if(n%prime[i]==0)
    30         {
    31             num=0;
    32             while(n%prime[i]==0)
    33             {
    34                 n=n/prime[i];
    35                 num++;
    36                 if(num>=2) return 0;
    37             }
    38         }
    39     }
    40     return n;
    41 }
    42 int main()
    43 {
    44     init();
    45     int T,t;
    46     LL n;
    47     scanf("%d",&T);
    48     for(t=1;t<=T;t++)
    49     {
    50         scanf("%I64d",&n);
    51         LL ans = Euler(n);
    52         if(ans==0)
    53         {
    54             printf("Case %d: No
    ",t);
    55         }
    56         else
    57         {
    58             LL cur=(LL)sqrt(ans*1.0);
    59             if(cur*cur==ans)printf("Case %d: No
    ",t);
    60             else printf("Case %d: Yes
    ",t);
    61         }
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    点子
    点子
    ruby crawler Anemone
    创业站
    我友网 没前途
    创意
    电商站
    尿布
    创意
    青番茄好项目
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3730726.html
Copyright © 2011-2022 走看看