1. 程式人生 > >線性篩素數

線性篩素數

span tro col -m std 正整數 \n str bre

題目描述

如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內)

輸入輸出格式

輸入格式:

第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。

接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。

輸出格式:

輸出包含M行,每行為Yes或No,即依次為每一個詢問的結果。

輸入輸出樣例

輸入樣例#1: 復制
100 5
2
3
4
91
97
輸出樣例#1: 復制
Yes
Yes
No
No
Yes

說明

時空限制:500ms 128M

數據規模:

對於30%的數據:N<=10000,M<=10000

對於100%的數據:N<=10000000,M<=100000

樣例說明:

N=100,說明接下來的詢問數均不大於100且不小於1。

所以2、3、97為質數,4、91非質數。

故依次輸出Yes、Yes、No、No、Yes。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,i,j,check[10000005] = {0},sushu[10000005],tot = 0,k;
 7 int main()
 8 {
 9     check[1] = 1;
10
scanf("%d %d",&n,&m); 11 for(i = 2;i <= n;i++) 12 { 13 if(check[i] == 0) 14 { 15 sushu[tot] = i; 16 tot= tot + 1; 17 } 18 for(j = 0;j < tot;j++) 19 { 20 if(i * sushu[j] > n) 21 { 22 break
; 23 } 24 check[i * sushu[j]] = 1; 25 if(i % sushu[j] == 0) 26 { 27 break; 28 } 29 } 30 } 31 for(i = 1;i <= m;i++) 32 { 33 scanf("%d",&k); 34 if(check[k] == 0) 35 printf("Yes\n"); 36 else 37 printf("No\n"); 38 } 39 return 0; 40 }

線性篩素數