【模板】線性篩(洛谷P3383)
阿新 • • 發佈:2018-11-08
Description
如題,給定一個範圍\(N\),你需要處理\(M\)個某數字是否為質數的詢問(每個數字均在範圍\(1-N\)內)
Input
第一行包含兩個正整數\(N\)、\(M\),分別表示查詢的範圍和查詢的個數。
接下來\(M\)行每行包含一個不小於1且不大於\(N\)的整數,即詢問該數是否為質數。
Output
輸出包含\(M\)行,每行為\(Yes\)或\(No\),即依次為每一個詢問的結果。
Solution
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m,x,cnt,prime[5000010]; bool isprime[10000010]; inline int read() { int ans=0; char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); while (ch>='0' && ch<='9') { ans=ans*10+ch-'0'; ch=getchar(); } return ans; } void getprime() { isprime[1]=1; for (int i=2;i<=n;i++) { if (!isprime[i]) prime[++cnt]=i; for (int j=1;j<=cnt && i*prime[j]<=n;j++) { isprime[i*prime[j]]=1; if (i%prime[j]==0) break; } } } int main() { n=read(),m=read(); getprime(); while (m--) { x=read(); if (isprime[x]) printf("No\n"); else printf("Yes\n"); } return 0; }