hdu 3826 Squarefree number (分解质因子)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/88960271

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3826

题意:若n能整除一个平方数,输出No,否则,输出Yes。

题解:我们直接分解质因子(质因子范围1000000),假如有超过两个相同的质因子,直接输出No。

分解完后,若n大于1000000,说明此数有大于1e6的质因子(绝对没有小于1e6的质因子,要有的话,前面早给解决了),那么此时它只能最多有两个大于1e6的质因子,因为再多的话,就超过long long范围了。

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

int tot,prime[1000100];
bool vis[1000100];

int ans[1000100];

void init()
{
    int n=1000002;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]){
            prime[++tot]=i;
            ans[i]=1; ///此数为素数
            ans[i+2]=2; ///这就相当于减2的情况
        }
        for(int j=1;j<=tot&&i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }

}
int main()
{

    init();

    int ncase,T=0;
    scanf("%d",&ncase);

    while(ncase--)
    {
        LL n;

        scanf("%lld",&n);
        int i=1;

        bool flag=1;
        while(prime[i]<=n&&i<tot)
        {
            int num=0;
            if(n%prime[i]==0)
            {
                while(n%prime[i]==0)
                {
                    n/=prime[i];
                    num++;

                }
//                printf("num=%d\n",n);
                if(num>1){
                    flag=0;break;
                }

            }
            i++;
        }

        if(n>1000000) ///分解完后说明有大于1e6的质因子
        {
            LL temp=(LL)sqrt((double)n);
            
            if(temp*temp==n) flag=0;
        }

        if(flag) {
            printf("Case %d: Yes\n",++T);
        }
        else printf("Case %d: No\n",++T);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/88960271