线性筛O(n)
推导一下复杂度:
对于第二重循环
可发现30=2*3*5是由15=3*5推出来的
有一个数的最小质数为x
则可用小于等于这个x的质数推出其他合数
那么每个数只会被推出一次(它只有一个最小质数)
所以总的复杂度为O(n)
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,x,y) for(int i=(x),i##_END=(y);i<=i##_END;i++)
#define M 10000005
int prime[M];
bool mark[M];
void Init(){
int cnt=0;
mark[1]=1;
FOR(i,2,M-1){
if(!mark[i])prime[cnt++]=i;
FOR(j,0,cnt-1){
int t=i*prime[j];
if(t>=M)break;
mark[t]=1;
if(!i%prime[j])break;
}
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
Init();
FOR(i,1,m){
int x;
scanf("%d",&x);
if(!mark[x])puts("Yes");
else puts("No");
}
return 0;
}