1. 程式人生 > >【luogu 3383】【模板】線性篩素數

【luogu 3383】【模板】線性篩素數

100% put pre esp log main col i++ 每一個

題目描述

如題,給定一個範圍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<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 bool is_prime(int x){
 7     if(x==1) return
false; 8 for(int i=2;i*i<=x;i++){ 9 if(x%i==0) return false; 10 } 11 return true; 12 } 13 int n,m; 14 int main(){ 15 scanf("%d%d",&n,&m); 16 for(int i=1;i<=m;i++){ 17 int x;scanf("%d",&x); 18 if(is_prime(x)) puts("Yes");
19 else puts("No"); 20 } 21 return 0; 22 }

艾式篩法:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath> 
 6 using namespace std;
 7 int n,m,q;bool is_prime[10000005];
 8 void eratos(int n){
 9     memset(is_prime,true,sizeof(is_prime));
10     is_prime[1]=false;
11     for(int i=2;i<=sqrt(n);i++){
12         if(is_prime[i]){
13             int j=i*2;
14             while(j<=n){
15                 is_prime[j]=false;
16                 j=j+i;
17             }
18         }
19     }
20 }
21 int main(){
22     scanf("%d%d",&n,&m);
23     eratos(n);
24     for(int i=1;i<=m;i++){
25         scanf("%d",&q);
26         if(is_prime[q]) printf("Yes\n");
27         else printf("No\n");
28     }
29     return 0;
30 }

歐式篩法(線性篩法):

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 bool is_prime[10000005];
 8 int prime[5000005],cnt=0,n,m,a; 
 9 void getlist(int n){
10     memset(is_prime,true,sizeof(is_prime));
11     is_prime[1]=false;
12     for(int i=2;i<=n/2;i++){
13         if(is_prime[i])prime[++cnt]=i;
14         for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
15             is_prime[i*prime[j]]=false;
16             if(i%prime[j]==0) break;
17         }
18     }
19 }
20 int main(){
21     scanf("%d%d",&n,&m);
22     getlist(n);
23     for(int i=1;i<=m;i++){
24         scanf("%d",&a);
25         if(is_prime[a]) printf("Yes\n");
26         else printf("No\n");
27     }
28     return 0;
29 }

【luogu 3383】【模板】線性篩素數