Squarefree number
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++
*/