[CodeForces230B]T-primes
Posted lyfoi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CodeForces230B]T-primes相关的知识,希望对你有一定的参考价值。
思路
观察发现,如果一个数(x)有(3)个因子,那么这(3)个数一定是(1),(x),(sqrt{x}),当然如果(sqrt{x})是一个合数,那么就会有多个,例如(16)
所以我们要判断输入的数据是否是完全平方数,以及它的根是否是素数
完全平方数很好判断,判断素数由于数据范围过大,需要线性筛素数。关于筛素数详见:Link
我们考虑有奇数个因数的整数的特点:显然它是一个完全平方数 。而判断完全平方数,只需要判断 (sqrt{x}) 取整的平方(即(|sqrt{x}|^2∣))是否等于 (x) 即可。
接下来考虑有三个因数的整数的特点:易知 (sqrt{x}) 不可再分解了,也就是质数,因此我们只需要将 ([1,sqrt{x}]) 范围内的所有质数筛出来即可!
(MAX) 表示 $sqrt{x}_{max} $ ,(sqr[i]) 表示第 (i) 个数是完全平方数, (np[i]) 表示第 $ i$ 个数不是质数。
Code
#include<cstdio>
#include<cmath>
#define MAX 1000005
#define ll long long
using namespace std;
int n,tot;
ll x;
bool np[MAX+10],sqr[MAX+10];
int p[100005];
void prepare()
{
for(int i=1;i*i<=MAX;i++) sqr[i*i]=1;
for(int i=4;i<=MAX;i+=2) np[i]=1;
tot=1; p[1]=2; np[0]=np[1]=1;
for(int i=3;i<=MAX;i+=2)
{
if(!np[i]) p[++tot]=i;
for(int j=1;j<=tot&&i*p[j]<=MAX;j++)
{
np[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
int main()
{
prepare();
scanf("%d",&n);
while(n--)
{
scanf("%lld",&x);
ll t=sqrt(x);
if(t*t==x&&!np[t]) puts("YES");
else puts("NO");
}
return 0;
}
以上是关于[CodeForces230B]T-primes的主要内容,如果未能解决你的问题,请参考以下文章
Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 树状数组维护区间最大值(示(代
ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) A Palindromic Supersequence(代
Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) C. Stairs and Elevators二分查找(示例(代
Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A,B,C真的菜·(代
Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) BWeakened Common Diviso(代