c语言判断素数不能tle,T-primes(预处理判断素数)

B. T-primes

(CF-230B)

time limit per test : 2 seconds

memory limit per test : 256 megabytes

input : standard input

output : standard output

Description

We know that prime numbers are positive integers that have exactly two distinct positive divisors. Similarly, we’ll call a positive integer t Т-prime, if t has exactly three distinct positive divisors.

You are given an array of n positive integers. For each of them determine whether it is Т-prime or not.

Input

The first line contains a single positive integer, n (1 ≤ n ≤ 105), showing how many numbers are in the array. The next line contains n space-separated integers xi (1 ≤ xi ≤ 1012).

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is advised to use the cin, cout streams or the %I64d specifier.

Output

Print n lines: the i-th line should contain “YES” (without the quotes), if number xi is Т-prime, and “NO” (without the quotes), if it isn’t.

Examples

Input

3

4 5 6

Output

YES

NO

NO

其实就是个判断素数的水题,时间为两秒,但用了常规的方法(直接用for遍历)之后发现一直tle,可能有个样例是数量很多并且数字都很大,于是就对数字先进行预处理,把非素数给标记,然后对于每一次的输入用O(1)的时间来判断是否为素数。

#include

using namespace std;

typedef long long ll;

const int maxn=1e6+5;

int a[maxn+1];

void isprime()

{

a[0]=a[1]=1;

memset(a,0,sizeof(a));

for(int i=2;i<=maxn;i++){

if(!a[i]){

for(int j=i+i;j<=maxn;j+= i){

a[j]=1;

}

}

}

}

int main(){

int t;

scanf("%d",&t);

isprime();

while(t--){

ll n;

scanf("%I64d",&n);

ll x=sqrt(n);

if(x>1&&x*x==n&&a[x]==0)

printf("YES\n");

else printf("NO\n");

}

return 0;

}

小结:对于素数的判断不只有for遍历,还可以先预处理再直接判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值