m*n=p并且m,n都是素数,那么一定是m,n一个比sqrt(p)大,一个比sqrt(p)小,或者m==n==sqrt(p),所以构造素数表时判断到sqrt(10^9)即可。
#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
int isprime(int n)
{
for(int i=2; i*i<=n; i++)
if(n%i==0) return 0;
return 1;
}
set<int>st;
int prime[4210],count=0;
int main()
{
int maxx=0;
prime[count++]=2;
prime[count++]=3;
st.insert(2);
st.insert(3);
for(int i=4; i<=40000; i++)
{
if(isprime(i))
{
prime[count++]=i;
st.insert(i);
maxx=max(maxx,i);
}
}
int n,p;
cin>>n;
while(n--)
{
cin>>p;
for(int i=0; i<count; i++)
{
if(prime[i]*prime[i]>p)
{
cout<<"No"<<endl;
break;
}
else if(p%prime[i]==0)
{
int a=p/prime[i];
if(st.count(a)||(a>maxx&&isprime(a)))
{
cout<<"Yes\n";
break;
}
}
}
}
return 0;
}