洛谷题解 | P3383 【模板】线性筛素数
题目思路
先思考最朴素的素数筛法。即对于每个数 \(n\),检查它是否能被任意小于 \(\sqrt{n}\) 的整数整除。如果不能,则 \(n\) 是素数。这种筛法显然是低效的。
逆向思考,上述素数筛思路为验证每个数是否为质数,那可不可以排除所有合数,这样剩下的自然是质数了?这就是埃氏筛。
埃氏筛的思想是:从 \(2\) 开始,将除了它本身所有 \(2\) 的倍数划掉,然后是 \(3\)、\(4\)、\(\dots\) 重复此过程,直到\(\sqrt{n}\),剩下的数就是小于 \(n\) 的所有素数。
这种筛法的复杂度为 \(\mathcal O(n \log \log n)\)。那如何做到 \(\mathcal O(n)\) 的复杂度?
观察发现,埃氏筛会重复筛除质数。如果每个合数仅被其最小质因数筛除一次,那就不会被重复筛除,也就是做到 \(\mathcal O(n)\) 了。这便是欧拉筛。
维护一个质数数组,对于每个新数,首先检查它是否是质数,若是则加入数组。接着用当前质数数组中的数去标记合数,当发现当前数能被某个质数整除时立即终止标记过程。这一点十分关键,它保证每个合数仅被其最小质因数筛除,也就只被筛除一次。
有人可能还是不明白为什么是这时候退出。确保每个合数仅被其最小质因数筛除一次,就是 \(i \times prime_{j}\) 不能拥有比 \(prime_{j}\) 更小的质因子,也就是 \(i\) 不能拥有比 \(prime_{j}\) 更小的质因子。如果发现 \(i\) 的最小质因子已经是 \(prime_{j}\) 了,此时不退出,下一轮循环的 \(prime_{j}\) 增大,\(i\) 中就有比它更小的质因子,于是就无法确保每个合数仅被其最小质因数筛除一次了。
欧拉筛因为每个合数仅被其最小质因数筛除一次,所以复杂度是 \(\mathcal O(n)\) 的。
AC 代码
#include <bits/stdc++.h>
using namespace std;
int n,q,cnt = 0,prime[100000010];
bool isprime[100000010];
int main(){
std::ios::sync_with_stdio(0);
cin >> n >> q;
memset(isprime,true,sizeof(isprime));
for(int i = 2;i <= n;i++){
if(isprime[i]) prime[++cnt] = i;
for(int j = 1;j <= cnt && i * prime[j] <= n;j++){
isprime[i * prime[j]] = false;
if(i % prime[j] == 0) break; //关键优化:如果 i % prime[j] == 0,说明 i 的最小质因数是 prime[j],此时终止内层循环,避免重复筛除
}
}
while(q--){
int k;
cin >> k;
cout << prime[k] << endl;
}
return 0;
}
洛谷题解 | P3383 【模板】线性筛素数的更多相关文章
- [洛谷P3383][模板]线性筛素数-欧拉筛法
Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...
- 洛谷 - P1891 - 疯狂LCM - 线性筛
另一道数据范围不一样的题:https://www.cnblogs.com/Yinku/p/10987912.html $F(n)=\sum\limits_{i=1}^{n} lcm(i,n) $ $\ ...
- 【洛谷 p3383】模板-线性筛素数(数论)
题目:给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内).(N<=10000000,M<=100000) 解法:1.欧拉筛O(n),数组近乎100KB:2.( ...
- 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]
题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...
- leetcode 204. Count Primes(线性筛素数)
Description: Count the number of prime numbers less than a non-negative number, n. 题解:就是线性筛素数的模板题. c ...
- 洛谷P3383 【模板】线性筛素数
P3383 [模板]线性筛素数 256通过 579提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 Too many or Too few lines 样例解释有问题 ...
- 洛谷 P3383 【模板】线性筛素数
P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...
- 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘
P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...
- [洛谷P4723]【模板】线性递推
题目大意:求一个满足$k$阶齐次线性递推数列$a_i$的第$n$项. 即:$a_n=\sum\limits_{i=1}^{k}f_i \times a_{n-i}$ 题解:线性齐次递推,先见洛谷题解, ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
随机推荐
- 浏览器如何确定最终的CSS属性值?解析计算优先级与规则
前言 上篇文章中有提到CSS值的处理过程,但如果想要确定一个元素的最终样式值可以不需要这么多步.实际上我们写的任何一个标签元素无论写没写样式,它都会有一套完整的样式.理解这一点非常重要️ 比如:一个简 ...
- <HarmonyOS第一课10>ArkUI进阶#鸿蒙课程##鸿蒙生态#
课程介绍 <HarmonyOS第一课:ArkUI进阶>是专为HarmonyOS开发者设计的课程,旨在提升开发者在ArkUI框架中的布局技能.课程将重点讲解如何进行布局性能优化,包括精简节点 ...
- 操作系统综合题之“采用二级页表的分页存储管理方式,计算页目录号的位数 和 页大小,给定页目录项大小计算页目录表大小,给定逻辑地址计算页内偏移量和物理地址[0x00200643]”
一.问题:某计算机系统的主存按字节编址,逻辑地址和物理地址都是32位,其内存管理采用两级页表的分页存储管理方式.逻辑地址中页号位10位,页内偏移地址为10位.该计算机系统的两级页表结构如下图所示,图中 ...
- golang 接口按需获取资源
场景 爬虫业务场景,我们需要调用三方接口获取代理ip地址,每个ip地址可以使用的时间有限和价格的,本着不浪费资源,我们在这里做一层封装. 当有其他业务调用我们接口的时候,会拉起定时任务,这个定时任务的 ...
- 基于.NetCore开发 StarBlog 番外篇 (4) 文章一键发布工具Publisher大升级,AI功能增强与界面优化
前言 自从上次开发了 StarBlogPublisher 这个文章创作神器之后 我的博客+公众号文章工作流效率提升了不少 不过这软件还有一些功能欠缺和我不满意的地方 这次就在这个下暴雨的周末,把这个软 ...
- codeup之C语言10.16(指针
Description 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.要求用3个函数实现,分别为输入10个数.进行处理.输出10个数.要求使用指针的方法进行处理. Inpu ...
- Deep Learning Book在线阅读
1.Deep Learning for Anomaly Detection https://ff12.fastforwardlabs.com/
- Java如何实现多线程
JAVA里面 JVM(java虚拟机) 就是 一个进程 进程与进程之间是绝对互相独立 我们运行多个main方法,代表有多个JAVA进程 进程里面有线程; 一个进程里面,允许有多个线程叫 ...
- kubernetes如何将pod运行在master节点
一.简单说明 这里我们部署的Kubernetes集群,master节点默认是unscheduled的状态,也就是默认拒绝将Pod调度到master节点运行.专业术语就是:Master节点被赋予了一个或 ...
- 2025 最野 AI 创业攻略!从 0 孵化爆款软件的底层逻辑:技术打磨 + 精准推广双杀
小伙伴们,上一篇内容我们讲到了自身的核心优势,那么今天大黄给大家讲讲我们的发展愿景. 我们的目标: 成为学习AI编程路上必看的内容合集知识库! 项目案例全部由真人编写实现,从0到1毫不保留全部展示出来 ...