当前位置: 首页 > news >正文

【算法学习笔记】30:埃氏筛(Sieve of Eratosthenes)和线性筛(Linear Sieve)

测试题目:AcWing 868. 筛质数

埃氏筛(Sieve of Eratosthenes)

如果 i i i是素数,每次把 i i i的倍数都筛掉,存在重复筛选,时间复杂度 n ⋅ l o g ( l o g n ) n \cdot log(logn) nlog(logn)

#include <iostream>using namespace std;const int N = 1e6 + 10;
int n, cnt = 0;
bool st[N]; // false as primeint main()
{cin >> n;for (int i = 2; i <= n; i ++ ){if (st[i]) continue;cnt ++ ;for (int j = i * 2; j <= n; j = j + i)st[j] = true;}cout << cnt << endl;return 0;
}

线性筛(Linear Sieve)

也叫欧拉筛,在埃氏筛的思想下,想办法让每个合数只被筛出去一次,消除重复筛选,这样时间复杂度就能降低到 O ( n ) O(n) O(n)

为了让每个合数 a a a只被筛出去一次,由于我们是从小到大筛选质数的,因此可以考虑让这个合数 a = a 1 ⋅ a 2 ⋅ . . . ⋅ a k a = a_1 \cdot a_2 \cdot ... \cdot a_k a=a1a2...ak由其最小的质因数 a 1 a_1 a1筛掉。

因此每次遍历到一个数 i i i,不论是质数或者合数,其最小质因数如果是 r r r,那么由于我们从小到大筛到了 i i i,所以质数 r r r一定已经在目前的质数结果集里了(被筛好了)。

进而,所有 < r <r <r的质数都已经被筛好了,我们可以对于每个 < = r <=r <=r的质数 x x x,把 x ⋅ i x \cdot i xi筛掉,那么因为 x ⋅ i x \cdot i xi的最小质因数一定是 x x x,所以理应在(且仅在)这一轮被筛掉。

然而,知道每个数 i i i的最小质因数 r r r是困难的,但反正我们都要拿它每个 < = r <=r <=r的质数 x x x去筛掉 x ⋅ i x \cdot i xi了,每次筛掉之后看一下质数 x x x是不是 i i i的因数就可以了,因为我们是从小到大遍历质数 x x x的,所以 x x x第一次成为 i i i的因数的时候, x x x就是 i i i的最小质因数,这时候就可以停止筛了。

如果没有停止筛会有什么问题?重复筛选导致的算法退化!试想应在 x x x i i i的因子时停止,最后一轮筛掉的就是 x ⋅ i x \cdot i xi,如果没有停下来,又取了下一个质数 x ′ x' x,筛掉了 x ′ ⋅ i x' \cdot i xi。因为 i i i的最小质因数就是 x x x,所以 x ′ ⋅ i x' \cdot i xi这个数应该在先前就被质数 x x x x ⋅ i ⋅ x ′ x x \cdot \frac{i \cdot x'}{x} xxix的模式筛过了!

写法上应该注意,线性筛不是像埃氏筛那样,只在发现质数的轮次筛合数,而是在每个轮次 i i i,不管最小质因数是 r r r的当前轮次 i i i是不是质数,都用 < = r <=r <=r的所有质数 x x x去筛 x ⋅ i x \cdot i xi,以保证每个数都仅被其最小质因数筛掉。

#include <iostream>using namespace std;const int N = 1e6 + 10;
int primes[N];
int n, cnt = 0;
bool st[N]; // false as primeint main()
{cin >> n;for (int i = 2; i <= n; i ++ ){if (!st[i]) primes[cnt ++ ] = i;for (int j = 0; primes[j] * i <= n; j ++ ){int x = primes[j];st[x * i] = true;if (i % x == 0) break;}}cout << cnt << endl;return 0;
}

相关文章:

【算法学习笔记】30:埃氏筛(Sieve of Eratosthenes)和线性筛(Linear Sieve)

测试题目&#xff1a;AcWing 868. 筛质数 埃氏筛&#xff08;Sieve of Eratosthenes&#xff09; 如果 i i i是素数&#xff0c;每次把 i i i的倍数都筛掉&#xff0c;存在重复筛选&#xff0c;时间复杂度 n ⋅ l o g ( l o g n ) n \cdot log(logn) n⋅log(logn)。 #includ…...

【AscendC】tiling方案设计不当引起的一个时隐时现的bug

在设计tiling方案时&#xff0c;通常会考虑到非对齐的场景&#xff0c;对输入数据进行补全操作从而使得非对齐场景也能正确的完成计算。但在某些算子的实现过程中&#xff0c;沿用上述操作却会造成数据的错误计算&#xff0c;且这种错误出现与否取决于随机生成的测试数据质量。…...

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…...

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…...

基于SpringBoot+Vue的健身房管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代生活节奏的加快&#xff0c;人们对健康的需求日益增强&#xff0c;健身房行业因此迎来了蓬勃的发展。然而&#xff0c;传统的健身房管理方式逐渐暴露出效率低下、会员信息管理混乱、课程安排不灵活等问题。为了解决这些…...

leetcode 面试经典 150 题:快乐数

链接快乐数题序号202题型数组解题方法哈希表难度简单熟练度✅✅✅✅ 题目 编写一个算法来判断一个数 n 是不是快乐数。 [快乐数] 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0…...

Leetcode 279. 完全平方数 动态规划 完全背包问题

原题链接&#xff1a;Leetcode 279. 完全平方数 class Solution { public:int numSquares(int n) {vector<int> dp(n 1, 0);for (int i 1; i < n; i) {int tmp INT_MAX;for (int j 1; j * j < i; j) {tmp min(tmp, dp[i - j * j]);}dp[i] tmp 1;}return dp[…...

python学opencv|读取图像(三十三)阈值处理图像-限定像素

【1】引言 前序我们已经掌握分解图像的通道&#xff0c;设置各个通道的RGB值&#xff0c;相关文章包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十四&#xff09;BGR图像和HSV图像通道拆分-CSDN博客 python学opencv|读取图像&#xff08;十五&#xff09;B…...

QT Quick QML 实例之椭圆投影,旋转

文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟&#xf…...

炸砖块游戏的最终图案

描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…...

LLM的实验平台有哪些:快速搭建测试大语言模型

LLM的实验平台有哪些:快速搭建测试大语言模型 目录 LLM的实验平台有哪些:快速搭建测试大语言模型低代码平台工程观测平台本地应用平台在线编程竞技场性能排名代码质量评估开源框架Hugging Face是一个机器学习和数据科学平台及社区主要功能开源工具与库应用场景优势低代码平台…...

python3GUI--大屏可视化-XX产业大数据指挥舱(附下载地址) By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件开发心得1.使用方法2.UI设计3.代码架构4.项目结构 四&#xff0e;代码片段分享1.图片平滑缩放组件2.滚动日志组件 五&#xff0e;心得体会 大小&#xff1a;35.0 M&#xff0c;软件安装包放在了这里! 本软件未…...

.NET 9.0 的 Blazor Web App 项目中 Hash 变换(MD5、Pbkdf2) 使用备忘

一、生成 string 对应的 MD5 码 /// <summary>/// 生成 string 对应的 MD5 码/// </summary>/// <param name"str">需要转换的字符串 string&#xff1a;用于登录认证时&#xff0c;str username 线下传递的key DateTime.Now.Ticks.ToString() …...

uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture

项目场景&#xff1a; uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture,在实现点击头像需要出发抖音小程序获取用户原生头像的操作中&#xff0c;无论如何也无法触发抖音的原生窗口&#xff01; 问题描述 这个问题我找了很多博主的方法&#xff…...

(undone) MIT6.S081 2023 学习笔记 (Day5: LAB4 traps)

LAB 网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/traps.html 任务1&#xff1a;RISC-V assembly (完成) 初步看问题要求&#xff0c;这是一道文科题(问答题) 在你的 xv6 仓库中有一个文件 user/call.c。执行 make fs.img 会对其进行编译&#xff0c;并生成…...

前端笔记----

在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架&#xff0c;也是用来写界面的&#xff0c;但是那是用来写客户端的&#xff0c;而html是用来写web浏览器的&#xff0c;相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…...

学习华为熵减,激发组织活力

目录 为什么学习华为&#xff1f; 学习华为什么&#xff1f; 一、势&#xff1a;顺势而为&#xff0c;在风口上猪都会飞起来。 二、道&#xff1a;就是认识和利用规律层面&#xff0c;文化和制度创新就是企业经营之道。 三、法&#xff1a;就是一套价值管理的变革方法论。…...

9Hive数据倾斜

这里写目录标题 数据倾斜问题剖析数据倾斜解决方案1. 空值引发的数据倾斜2. 不同数据类型引发的数据倾斜3. 不可拆分大文件引发的数据倾斜4. 数据膨胀引发的数据倾斜5. 表连接时引发的数据倾斜6. 确实无法减少数据量引发的数据倾斜 总结 数据倾斜问题剖析 数据倾斜是分布式系统…...

【大数据】机器学习 -----关于data.csv数据集分析案例

打开表 import pandas as pd df2 pd.read_csv("data.csv",encoding"gbk") df2.head()查看数据属性&#xff08;列标题&#xff0c;表形状&#xff0c;类型&#xff0c;行标题&#xff0c;值&#xff09; print("列标题:",df2.columns)Data…...

深入解析 C++ 类型转换

简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...