洛谷 P3383 【模板】線性篩素數
阿新 • • 發佈:2017-11-06
toolbar left 整數 show scan fin names 一行 bar
P3383 【模板】線性篩素數
題目描述
如題,給定一個範圍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。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 10000100 using namespacestd; int n,m,tot; bool yes[MAXN]; int prime[1000000]; void pre(){ memset(yes,true,sizeof(yes)); yes[1]=false; for(int i=2;i<=n;i++){ if(yes[i]) prime[++tot]=i; for(int j=1;prime[j]*i<=n;j++){ yes[prime[j]*i]=false; if(i%prime[j]==0) break; } } } int main(){ scanf("%d%d",&n,&m); pre(); cout<<tot; for(int i=1;i<=m;i++){ int x; scanf("%d",&x); if(yes[x]) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
洛谷 P3383 【模板】線性篩素數