当前位置: 首页 > 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 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...

为你的项目量身定制,基于快马ai生成openclaw实战集成安装方案

最近在做一个图像处理相关的项目&#xff0c;需要在Ubuntu服务器上集成OpenClaw来处理图像数据&#xff0c;同时还要和OpenCV协同工作。整个过程踩了不少坑&#xff0c;今天就把我的实战经验分享给大家&#xff0c;特别是如何利用InsCode(快马)平台来快速生成定制化的安装方案。…...

OpenClaw技能扩展指南:安装Qwen3-4B驱动的内容处理模块

OpenClaw技能扩展指南&#xff1a;安装Qwen3-4B驱动的内容处理模块 1. 为什么需要技能扩展&#xff1f; 上周我整理项目文档时&#xff0c;面对十几个Markdown文件的手动合并操作&#xff0c;突然意识到&#xff1a;OpenClaw的默认能力可能无法满足深度内容处理需求。这正是技…...

告别DCOM噩梦:手把手教你用KepOPC DA2UA中间件搞定OPC DA到UA的转换(附Python读写测试代码)

工业数据互通新范式&#xff1a;零配置实现OPC DA到UA的无缝迁移实战 如果你是一名工业自动化工程师&#xff0c;一定对这样的场景不陌生&#xff1a;凌晨两点还在客户现场调试DCOM配置&#xff0c;反复检查防火墙规则、用户权限和网络策略&#xff0c;却依然无法让OPC DA客户端…...

Phi-3-mini-128k-instruct部署案例:高校AI教学平台中嵌入式大模型实验环境搭建

Phi-3-mini-128k-instruct部署案例&#xff1a;高校AI教学平台中嵌入式大模型实验环境搭建 1. 项目背景与模型介绍 在高校AI教学领域&#xff0c;搭建一个轻量级但功能强大的实验环境至关重要。Phi-3-Mini-128K-Instruct作为一款仅38亿参数的轻量级开放模型&#xff0c;凭借其…...

SenseVoice-small轻量优势:模型加载时间<2秒,首字响应<800ms

SenseVoice-small轻量优势&#xff1a;模型加载时间&#xff1c;2秒&#xff0c;首字响应&#xff1c;800ms 1. 引言&#xff1a;当语音识别遇上“秒开”体验 想象一下这个场景&#xff1a;你正在一个网络信号极差的山区&#xff0c;或者在一台没有独立显卡的旧电脑上&#x…...

番茄小说下载器:全能解析引擎驱动的一站式数字阅读解决方案

番茄小说下载器&#xff1a;全能解析引擎驱动的一站式数字阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读日益普及的今天&#xff0c;读者们常面临三大…...

FactoryBluePrints:戴森球计划模块化工厂自动化解决方案

FactoryBluePrints&#xff1a;戴森球计划模块化工厂自动化解决方案 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints是戴森球计划的开源蓝图仓库&#xf…...

蓝桥杯备赛:Day5-P1706 全排列问题

&#x1f4da; 算法笔记&#xff1a;P1706 全排列问题 (DFS 基础) 1. 题目描述 P1706 全排列问题 - 洛谷 输出 1∼N1 \sim N1∼N 的所有全排列&#xff0c;要求每个数字占 5 个场宽&#xff0c;排列按字典序从小到大输出。 2. 核心代码 (C 版本) #include <bits/stdc.h…...

智能编码伙伴:基于快马AI与openclaw打造你的AI辅助开发chrome插件

最近在开发一个Chrome插件时&#xff0c;发现结合AI能力可以大幅提升开发效率。于是尝试用openclaw框架和InsCode(快马)平台的AI辅助功能&#xff0c;打造了一个智能开发助手插件。这个项目让我深刻体会到AI如何改变传统插件开发模式&#xff0c;下面分享下具体实现思路和关键点…...

别再折腾本地环境了!用Google Colab免费GPU跑通YOLOv8的保姆级教程

别再折腾本地环境了&#xff01;用Google Colab免费GPU跑通YOLOv8的保姆级教程 第一次接触YOLO目标检测模型时&#xff0c;我被它强大的实时检测能力震撼了——直到尝试在本地配置环境。CUDA版本冲突、PyTorch安装报错、显卡驱动不兼容...这些坑让我的热情迅速降温。直到发现G…...