問題描述
如題,給定一個範圍N,你需要處理M個某數字是否爲質數的詢問(每個數字均在範圍1-N內)
輸入
第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。
接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否爲質數。
輸出
輸出包含M行,每行爲Yes或No,即依次爲每一個詢問的結果。
樣例輸入
100 5
2
3
4
91
97
樣例輸出
Yes
Yes
No
No
Yes
算法討論
線性篩模板。
#include <cstdio>
#define MAX_N 10000006
using namespace std;
int primes[MAX_N],v[MAX_N],n,m,l;
bool f[MAX_N];
void prime()
{
for (int i=2;i<=n;i++)
{
if (v[i]==0)
{
v[i]=i;
primes[++l]=i;
f[primes[l]]=1;
}
for (int j=1;j<=l;j++)
{
if (primes[j]>v[i] || primes[j]>n/i)
break;
v[i*primes[j]]=primes[j];
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
prime();
for (int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
if (f[x])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}