3068: 【普及-】【P3383】线性筛素数
内存限制:512 MB
时间限制:2.000 S
评测方式:文本比较
命题人:
提交:7
解决:3
题目描述
如题,给定一个范围 ,有 个询问,每次输出第 小的素数。对于 的数据,,,保证查询的素数不大于 。
输入
第一行包含两个正整数 ,分别表示查询的范围和查询的个数。
接下来 行每行一个正整数 ,表示查询第 小的素数。
输出
输出 行,每行一个正整数表示答案。
样例输入 复制
100 5
1
2
3
4
5
样例输出 复制
2
3
5
7
11
提示
#include<bits/stdc++.h> using namespace std; #define MAXN 100000010 bool is_prime[MAXN]; int prime[MAXN]; //埃筛 int Er_Sieve(int n){ int tot=0; memset(is_prime,1,sizeof(is_prime)); is_prime[1] = is_prime[0] = 0; for(int i = 2;i <= n;i++){ if(!is_prime[i]) continue; prime[++tot] = i; //prime[]存储了[1,n]的所有质数 for(int j = i*2; j <= n; j+=i) is_prime[j]=0; //j为合数 } return tot; } //线性筛(欧拉筛) int Eu_Sieve(int n){ int tot=0; memset(is_prime,1,sizeof(is_prime)); is_prime[0] = is_prime[1] = 0; for(int i = 2; i <= n; i++){ if(is_prime[i]) prime[++tot] = i; //prime[]存储了[1,n]的所有质数 for(int j = 1; j <= tot && prime[j]*i <= n; j++){ //关键一 is_prime[prime[j]*i] = 0; if(i%prime[j] == 0) break;// 关键二 } } return tot; } int n,q,k; int main(){ int n; scanf("%d %d", &n, &q); Eu_Sieve(n); while(q--) { scanf("%d", &k); printf("%d\n", prime[k]); } return 0; }