版本2
注意:
0和1都不是素数
#include <cstdio>
#include <cstring>
#include <iostream>
typedef long long LL;
using namespace std;
const int N = 10000005;
LL primes[N];
bool st[N];
int k;
void primeTable(int n){
for(int i = 2; i <= n; i++){
if(!st[i]) primes[k++] = i;
for(int j = 0; primes[j] <= n/i; j++){
st[primes[j] * i] = true;
if(i % primes[j]==0) break;
}
}
}
int n,m;
int main(){
int num;
st[0] = true;
st[1] = true;
scanf("%d%d",&n,&m);
primeTable(n);
while(m--){
scanf("%d",&num);
printf("%s\n",st[num]?"No":"Yes");
}
return 0;
}
版本1
#include <cstdio>
#include <cstring>
#define N 10000005
#define LL long long
LL prime[N];
int p[N];
void primeTable(int n){
int k = 1;
memset(p,1,sizeof(p));
p[0] = 0;
p[1] = 0;
for(int i=2;i<=n;i++){
if(p[i]){
prime[k++] = i;
}
for(int j=1;j < k;j++){
if(i*prime[j]>N) break;
p[i*prime[j]] = 0;
if(i%prime[j]==0) break;
}
}
}
int n,m;
int main(){
int num;
scanf("%d%d",&n,&m);
primeTable(n);
while(m--){
scanf("%d",&num);
printf("%s\n",p[num]?"Yes":"No");
}
return 0;
}