Squarefree number HDU - 3826(数论:唯一分解定理 )

Squarefree number

 HDU - 3826

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.

解题思路:

由于任何一个数都可以由素数的乘积形式表示。我们要判断一个数n是否含有平方数因子,那么,只需要依次尝试1~n的所有素数prime[i] ,如果n%(prime[i]^2)==0说明这不是一个Squarefree number,相反,若找不到这样的素数那么就能说明n是一个Squarefree number!

可问题在于2 <= N <= 10^18  。。。就连打出素数表都会爆。但我们考虑到最差情况N = 10^18 ,那么我们判断N是不是Squarefree number需要找的是N = prime1 ^2  *  prime2  ,这里的假设最小素因子prime1,那么prime1绝不会超过1e6(超过1e6总体上就会超出1e18)。 所以我们得到了解法:遍历1~1e6的所有素数,如果n%(prime[i]^2)==0直接输出"No",如果没有找到,只需要再通过开平方验证n是不是平方数即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; 
const int maxn = 1e6+5; 
int prime[maxn];
int isprime[maxn];
int tot;
void init()
{
    memset(isprime,true,sizeof(isprime));
    for(int i=3;i<maxn;i++) if(!i&1) isprime[i] = false; 


	for(int i=3;i<sqrt(1.0*maxn);i++)  
	{
		if(isprime[i])    
		for(int j=i*i;j<maxn;j+=i*2)  
		{
			isprime[j] = false; 
		}
	}
	
	tot=0;
	prime[tot++] = 2; 
	for(int i=3;i<maxn;i+=2) 
	{
		if(isprime[i]) prime[tot++]=i; 
	}
}
int main(void)
{
	std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); 
	int T;cin>>T;
	init();
	int cas=0;
	while(T--)
	{
		ll n;cin>>n;
		int flag = true; 
		for(int i = 0;i<tot&&(ll)prime[i]*prime[i]<=n;i++)
		{
			if(!(n%((ll)prime[i]*prime[i]))) {
				flag = false;
				break;
			}
			if(!n%prime[i]) n/=prime[i]; 

		}
		if(n==1) 
		{
			cout<<"Yes"<<endl;
			continue;
		}
		ll sqn = sqrt(1.0*n);
		if(sqn*sqn==n) flag = false;
		cout<<"Case "<<++cas<<": "<<(flag?"Yes":"No")<<endl;     

	}
}
/*
Accepted   time:31ms	Mem:5.6MB	Length:1066	  C++
*/

猜你喜欢

转载自blog.csdn.net/Achanss/article/details/82822059
今日推荐