版权声明:转载注明下出处就行了。 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;
}