1. 程式人生 > >洛谷 P3383 【模板】線性篩素數

洛谷 P3383 【模板】線性篩素數

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 namespace
std; 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 【模板】線性篩素數