水题啊...
先打出一个规模为sqrt(N)的质数表...
再一个个暴力找...
By the way, 如果N被质数表约完后还>sqrt(N),那么此时N也是一个质数...
代码如下:
#include <stdio.h>
int prime[10000] = {0}, tot = 0;
void pre()
{
int hash[100001] = {0};
int i, j;
for(i = 2; i <= 100000; ++i)
{
if(!hash[i]) prime[++tot] = i;
for(j = 1; j <= tot && i * prime[j] <= 100000; ++j)
{
hash[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
int check(int N)
{
int i;
int sum = 0;
for(i = 1; i <= tot && prime[i] <= N; ++i)
{
while(N % prime[i] == 0)
{
N /= prime[i];
sum++;
if(sum > 2) break;
}
if(sum > 2) break;
}
if(N > 100000) sum++;
if(sum == 2) return 1;
else return 0;
}
int main()
{
int T, N;
pre();
scanf("%d", &T);
while(T--)
{
scanf("%d", &N);
if(N == 1) puts("No");
else
{
if(check(N)) puts("Yes");
else puts("No");
}
}
return 0;
}