线性筛法求素数

题目链接

P3383 【模板】线性筛素数


P3383 【模板】线性筛素数

题目描述

如题,给定一个范围 \(n\),有 \(q\) 个询问,每次输出第 \(k\) 小的素数。

输入格式

第一行包含两个正整数 \(n,q\),分别表示查询的范围和查询的个数。

接下来 \(q\) 行每行一个正整数 \(k\),表示查询第 \(k\) 小的素数。

输出格式

输出 \(q\) 行,每行一个正整数表示答案。

输入

100 5
1
2
3
4
5

输出

2
3
5
7
11

说明/提示

【数据范围】
对于 \(100\%\) 的数据,\(n = 10^8 ,1 \le q \le 10^6\) ,保证查询的素数不大于 \(n\)

代码

  • 时间复杂度:\(O(n)\)
#include<bits/stdc++.h>
using namespace std;
int n,q,k;
int prime[6000010];
int v[100000010];
int m;
void primes(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!v[i])
        {
            v[i]=i;
            prime[++m]=i;
        }
        for(int j=1;j<=m;j++)
        {
            if(v[i]<prime[j]||prime[j]*i>n)break;
            v[i*prime[j]]=prime[j];
        }
    }
}
int main()
{
    scanf("%d%d",&n,&q);
    primes(n);
    while(q--)
    {
        scanf("%d",&k);
        printf("%d\n",prime[k]);
    }
    return 0;
}
posted @ 2021-09-21 22:01  zyy2001  阅读(65)  评论(0编辑  收藏  举报