题目描述:
113. Nearly prime numbers
time limit per test: 0.5 sec.
memory limit per test: 4096 KB
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
本来将n的范围也看成10^9 了,想了半天无解。。。
后来试着就暴一下试试,居然就AC了,然后才发现n的范围其实小的可怜。。。
果然是2B青年欢乐多啊。。
其实我们只要预处理出10^5以内的质素,然后做判断就可以了
实现看代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<algorithm>
#include<vector>
#include<cstdlib>
#define inf 0xfffffff
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
int const nMax = 40000;
typedef int LL;
typedef pair<LL,LL> pij;
bool a[nMax];
int p[nMax],k;
void init(){
for(int i=2;i<nMax;i++)if(!a[i]){
p[k++]=i;
for(int j=i*i;j<nMax;j+=i)a[j]=true;
}
//for(int i=0;i<10;i++)printf("%d ",p[i]);
}
void f(int nn){
int cnt=0;
// printf("n=%d\n",nn);
for(int i=0;i<k&&p[i]<=nn;i++)if(nn%p[i]==0){
// printf("p[i]=%d ",p[i]);
while(nn%p[i]==0){
cnt++;
nn/=p[i];
}
if(cnt>2){
puts("No");
return ;
}
}
if(nn>1)cnt++;
// printf("cnt=%d \n",cnt);
if(cnt==2)
puts("Yes");
else puts("No");
return ;
}
int main(){
init();
int n,m;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
f(m);
}
return 0;
}