埃氏筛
剔除为素数倍数的数
时间复杂度O(n*lglgn) 在数据范围小的时候比欧拉筛效率高。

void Prime(){
for(int i=2;i<sqrt(maxn) + 0.5 ;++i)
if(prime[i])
for(int j=i;j<maxn;j+=i)
prime[j]=0;
}
欧拉筛(线性筛)
求0~maxn的素数并储存在 bool prime[maxn] 里
如果 bool 占空间可以用 bitset
时间复杂度 O(n)
#include<bitset>
bitset<maxn>prime;
#include<iostream>
#include<algorithm>
#define For(i,a,n) for(register int i=a;i<=n;i++)
#define MAX 10000005
using namespace std;
bool prime[MAX];
int is_prime[MAX];
void make_prime(int maxn){
int num=0;
memset(prime,true,maxn);
prime[0]=prime[1]=false;
For(i,2,maxn){
if(prime[i]) is_prime[num++]=i;
for(int j=0;j<num&&i*is_prime[j]<maxn;j++){
prime[i*is_prime[j]]=false;
if(i%is_prime[j]==0) break;
}
}
}
int main(){
ios::sync_with_stdio(false);
int maxn,n,t;
cin>>maxn>>n;
make_prime(maxn+5);
For(i,1,n){
cin>>t;
if(prime[t]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}