洛谷 P3383:线性筛素数 ← 埃氏筛

【题目来源】
https://www.luogu.com.cn/problem/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≤q≤10^6,保证查询的素数不大于 n。

【算法分析】
● 先用高效的素数筛选算法(埃氏筛优化版 / 线性筛)预处理出 10^8 以内的所有素数并存储,再通过数组直接查询第 k 小的素数(数组下标对应排名)。

● 执行示例(以 n=10 为例)如下所示
(1)初始化 st0...10 = true, true, true, true, true, true, true, true, true, true, true。
(2)手动标记 st0=st1=false,此时 st = f, f, t, t, t, t, t, t, t, t, t。
(3)外层循环 i 从 2 开始(i*i<=10,即 i<=3):
○ i=2:st2=true(素数),内层循环从 j=4 开始,标记 4、6、8、10 为 false,此时 st4/6/8/10=f。
○ i=3:st3=true(素数),内层循环从 j=9 开始,标记 9 为 false,此时 st9=f。
○ i=4:4*4=16>10,循环终止。
(4)最终 st 数组:f, f, t, t, f, t, f, t, f, f, f。
(5)未被标记为 false 的数(2、3、5、7)就是 10 以内的素数,符合预期。

【算法代码】

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e8+5;
bool st[maxn]; //isPrime
int p[maxn]; //prime
int cnt;

void seive(int n) {
    memset(st,true,sizeof st);
    st[0]=st[1]=false;
    for(int i=2; i*i<=n; i++) {
        if(!st[i]) continue;
        for(int j=i*i; j<=n; j+=i) st[j]=false;
    }

    for(int i=2; i<=n; i++) {
        if(st[i]) p[++cnt]=i;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n,q,k;
    cin>>n>>q;
    seive(n);
    while(q--) {
        cin>>k;
        cout<<p[k]<<"\n";
    }

    return 0;
}

/*
in:
100 5
1
2
3
4
5

out:
2
3
5
7
11
*/

【参考文献】
https://blog.csdn.net/rstyduifudg/article/details/147163559
https://www.luogu.com.cn/problem/solution/P3383

相关推荐
爱读书的小胖1 小时前
LeetCode 27. 移除元素(C)解题分析
数据结构·算法
爱读书的小胖2 小时前
Codewars: A Brave New Wordle(C)解题分析
c语言·数据结构·算法
Escalating_xu2 小时前
【数据结构】顺序表的应用:动态通讯录项目与双指针经典算法
c语言·数据结构·算法
从小白到软工3 小时前
C语言(中)预告
c语言·数据结构·经验分享·ai编程
垆边人似月.3 小时前
华为题:任务调度
数据结构·c++·算法
Logic1013 小时前
C语言/数据结构字符串题解:解压缩“字符+次数“格式——多位数字处理与字符串还原
c语言·数据结构·字符串·模拟·时间复杂度·空间复杂度·算法题
信奥卷王3 小时前
[GESP202506 六级] 最大因数(含视频)
数据结构·算法
局部有解3 小时前
Leetcode - 42 接雨水(一维)
数据结构·c++·算法·leetcode
专注API从业者4 小时前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
Logic1014 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质