113. Nearly prime numbers time limit per test: 0.5 sec. Nearly prime number is an integer positive number for which it is possible to find such primes P1 and P2 that given number is equal to P1*P2. There is given a sequence on N integer positive numbers, you are to write a program that prints “Yes” if given number is nearly prime and “No” otherwise. Input Input file consists of N+1 numbers. First is positive integer N (1£N£10). Next N numbers followed by N. Each number is not greater than 109. All numbers separated by whitespace(s). Output Write a line in output file for each number of given sequence. Write “Yes” in it if given number is nearly prime and “No” in other case. Sample Input 1 6 Sample Output Yes | ||||||
|
一个数如果能被写成两个素数之积称之为near prime。
/**********************
* author:crazy_石头
* Pro:SGU 113
* algorithm:素数筛
* Time:15ms
* Judge Status:Accepted
***********************/
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define rep(i,h,n) for(int i=(h);i<=(n);i++)
#define ms(a,b) memset((a),(b),sizeof(a))
#define eps 1e-6
#define INF 1<<29
#define LL __int64
const int maxn=40000+5;
const int maxm=200+10;
int prime[maxn],cnt;
int p[maxn];
int n;
inline void init_prime()
{
ms(p,0);
p[0]=p[1]=1;//0和1不是素数;
rep(i,2,maxn)
{
if(!p[i])
{
for(int j=i+i;j<=maxn;j+=i)
p[j]=1;//若i是素数,则它的倍数不是素数,改为1;
}
}
rep(i,2,maxn)
{
if(!p[i])
prime[cnt++]=i;
}
}
inline bool judge(int n)
{
if(n<2)return false;
for(int i=2;i*i<=n;i++)
if(n%i==0)return false;
return true;
}
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
cnt=0;
init_prime();
int ok=0;
scanf("%d",&n);
rep(i,0,cnt-1)
{
if(n%prime[i]==0&&judge(n/prime[i]))
{//n等于两个素数之积,说明n%prime[i]==0并且另一个除数也是素数;
ok=1;
break;
}
}
if(ok)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}