题目思路

先思考最朴素的素数筛法。即对于每个数 \(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 【模板】线性筛素数的更多相关文章

  1. [洛谷P3383][模板]线性筛素数-欧拉筛法

    Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...

  2. 洛谷 - P1891 - 疯狂LCM - 线性筛

    另一道数据范围不一样的题:https://www.cnblogs.com/Yinku/p/10987912.html $F(n)=\sum\limits_{i=1}^{n} lcm(i,n) $ $\ ...

  3. 【洛谷 p3383】模板-线性筛素数(数论)

    题目:给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内).(N<=10000000,M<=100000) 解法:1.欧拉筛O(n),数组近乎100KB:2.( ...

  4. 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]

    题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...

  5. leetcode 204. Count Primes(线性筛素数)

    Description: Count the number of prime numbers less than a non-negative number, n. 题解:就是线性筛素数的模板题. c ...

  6. 洛谷P3383 【模板】线性筛素数

    P3383 [模板]线性筛素数 256通过 579提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 Too many or Too few lines 样例解释有问题 ...

  7. 洛谷 P3383 【模板】线性筛素数

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

  8. 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

  9. [洛谷P4723]【模板】线性递推

    题目大意:求一个满足$k$阶齐次线性递推数列$a_i$的第$n$项. 即:$a_n=\sum\limits_{i=1}^{k}f_i \times a_{n-i}$ 题解:线性齐次递推,先见洛谷题解, ...

  10. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

随机推荐

  1. 当数据爆炸遇上SQL Server:优化策略全链路解析

    在数据驱动的时代,海量数据冲击下的数据库性能成为系统成败的关键.SQL Server作为企业级数据库的常青树,面对单表亿级数据量时,我们往往陷入分库分表与否的抉择困境. 我们站在SQL Server视 ...

  2. HttpServletRequest相关

    简介 获取客户端请求头及参数 获取提交给服务器的中文数据 简介 这个对象封装了客户端提交过来的一切数据. 获取客户端请求头及参数 package com.zhujunwei.httpServletRe ...

  3. mssql sqlserver 使用xp_cmdShell运行时,报15281异常的处理办法

    下文讲述 使用xp_cmdshell运行时,出现消息异常的操作方法,如下所示:实验环境:sql server 2008 R2 今天在sql查询管理器中运行xp_cmdshell命令时,出现以下错误现象 ...

  4. P2150 [NOI2015] 寿司晚宴 题解

    P2150 [NOI2015] 寿司晚宴 刚开始看错题了,推了一个与原题类似的 DP 方程,然后不会优化,笑了. 思路 首先看到 \(n\) 很小,然后质因子个数就更少了. 因此第一反应是将所有的质因 ...

  5. jdk11.0.2下载安装-环境配置

    下载 JDK下载地址https://www.oracle.com/technetwork/java/javase/downloads/index.html 然后同意,选择自己适合的版本 PS: 1.z ...

  6. Grind75详解

    Day1 001 ToSum //O(n2) public int[] TwoSum(int[] nums, int target) { for (int i = 0; i < nums.Len ...

  7. HashMap知识点梳理、常见面试题和源码分析

      本博客是包括HashMap在内的相关知识点博文链接的入口,从介绍哈希表的基本概念开始,到HashMap的应用.实现原理和常见面试题,包括分析其源码,还包括相关知识点的延伸,例如HashSet等. ...

  8. Java 代码块与代码加载顺序

    本文首先介绍几个基本的名次,然后介绍了三种代码块的特性和使用方法. 在面试大型公司时,如果遇到大型国企或者大的互联网私企,笔试中经常遇到代码块和代码加载顺序的笔试题.这里做一个总结,也方便各位小伙伴飙 ...

  9. Java 验证电子邮箱是否合法

    工作中,常常遇到校验电子邮箱字符串是否符合规范的需求,这里提供如下两个基于正则表达式的校验方法: public static final String EMAIL_REGEX_DEFAULT = &q ...

  10. 【pr】眨眼特效

    来源 这个后半段 步骤 新建一段黑场视频 效果->网格化->边角的两个数值调整很大(4000,4000),现在黑场只剩下一个白色十字架. 效果控件->网格->锚点->第一 ...