news 2026/3/17 19:21:18

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 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。

【算法分析】
● 素数判断的经典代码,如下所示。但是,当 n 较大时(如 1e8),会非常耗时‌,最终导致 TLE。

bool isPrime(int n) { if(n<2) return false; for(int i=2; i<=sqrt(n); i++) { if(n%i==0) return false; } return true; }

● 解决方法是先用高效的素数筛选算法(埃氏筛/欧拉筛)预处理出 1e8 以内的所有素数并存储,再通过数组直接查询第 k 小的素数(数组下标对应排名)。
其中,静态埃氏筛详见 →
https://blog.csdn.net/hnjzsyjyj/article/details/157615246

#include<bits/stdc++.h> using namespace std; const int maxn=1e8+5; bool st[maxn]; //isPrime int p[maxn]; //prime int cnt; void e_sieve(int n) { //eratosthenes_sieve 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; e_sieve(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 */

但是,静态埃氏筛代码中定义了 maxn=1e8+5,对应的两个数组:
bool st[1e8+5]:占用约 1e8 字节 ≈ 100MB
int p[1e8+5]:占用约 4*1e8 字节 ≈ 400MB
总计约 500MB 内存,这还只是 1e8 的情况。
这在内存受限的情况下,可能会导致
MLEMemory Limit Exceeded,内存超限)。
解决方法是
vector替代全局静态数组,核心是节省内存、提升灵活性、避免溢出。
因此,动态埃氏筛应运而生。

● 那么,在动态埃氏筛中,如何对一个含 n 个元素的 bool 型的 vector 初始化为 true?
方法一:创建 vector 的同时直接初始化为 true(最常用)
例如,
vector<bool> st(n, true);
方法二:vector 已存在,需要将其重置为全 true
例如,
st.assign(n, true);

【算法代码:动态埃氏筛

#include<bits/stdc++.h> using namespace std; vector<bool> st; //isPrime vector<int> p; //prime void e_sieve(int n) { //eratosthenes_sieve st.assign(n+1,true); //0~n 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.push_back(i); } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,q,k; cin>>n>>q; e_sieve(n); while(q--) { cin>>k; cout<<p[k-1]<<"\n"; } return 0; } /* in: 100 5 1 2 3 4 5 out: 2 3 5 7 11 */





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




版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 22:06:49

从此告别拖延,AI论文写作软件千笔·专业论文写作工具 VS 万方智搜AI

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。越来越多的专科生开始借助这些智能工具来提升写作效率、优化论文结构&#xff0c;甚至在文献检索与格式规范方面也获得专业支持。然而&#xff0c;面对市场上种类繁多、功能各…

作者头像 李华
网站建设 2026/3/13 10:37:20

MAC物理地址和IP网络地址有什么区别?

目录 一、什么是MAC地址二、什么是IP地址三、如何隐藏真实的MAC地址四、如何隐藏真实的IP地址 一、什么是MAC地址 MAC地址&#xff0c;全称为媒体访问控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一种用于网络通信的唯一标识符。它是由IEEE 8…

作者头像 李华
网站建设 2026/3/14 3:23:27

Embedding模型深度解析:从词向量到语义空间的完整指南

本文深入剖析Embedding(嵌入)模型的核心原理,从最基础的词向量概念出发,详细讲解向量空间中的语义关系、相似度计算、训练方法,以及在搜索、推荐、RAG等场景中的实际应用。 一、什么是Embedding? 1.1 从One-Hot到Embedding 问题:计算机如何理解"猫"和"…

作者头像 李华
网站建设 2026/3/14 11:17:07

Substance P (2-11) (Deca-Substance P) ;PKPQPFFGLM-NH₂

一、基础信息 英文名称&#xff1a;Substance P (2-11) (Deca-Substance P)三字母序列&#xff1a;Pro-Lys-Pro-Gln-Gln-Phe-Phe-Gly-Leu-Met-NH₂单字母序列&#xff1a;PKPQPFFGLM-NH₂精确分子量&#xff1a;1191.46 Da等电点&#xff08;pI&#xff09;&#xff1a;6.0~6.…

作者头像 李华
网站建设 2026/3/14 10:51:31

48 多源动态最优潮流分布式鲁棒优化:应对风光不确定性

48多源动态最优潮流分布式鲁棒优化 关键词&#xff1a;分布式鲁棒优化 风光不确定性 最优潮流 Wasserstein距离 仿真软件&#xff1a;matlabyalmipcplex 参考文档&#xff1a;《多源动态最优潮流的分布鲁棒优化方法》 主要内容&#xff1a;针对大规模清洁能源接入电网引起的系统…

作者头像 李华
网站建设 2026/3/16 20:16:46

空指针之痛:除了 if!=null,你还有更优雅的办法吗?

一、 序言&#xff1a;那个价值十亿美元的错误 在 Java 世界里&#xff0c;java.lang.NullPointerException&#xff08;NPE&#xff09;是每个开发者的宿命。它的发明者 Tony Hoare 曾公开道歉&#xff0c;称其为“十亿美元的错误”。 在生产环境中&#xff0c;NPE 往往意味着…

作者头像 李华