筛质数—(埃氏筛欧拉筛)

news2024/11/27 17:56:45

埃氏筛&欧拉筛

  • 埃氏筛
  • 欧拉筛

例题:AcWing 868. 筛质数
在这里插入图片描述
对欧拉筛的理解不是很深刻,写下自己的理解,加深一下理解,也方便后期忘记后再学习

埃氏筛

埃氏筛的主要思想是让质数x去筛掉x的所有合数,这个比较容易理解。
合数都是由质数构成,所以合数一定会被其合数筛掉。

举个例子:
质数2,可以筛掉合数4,6,8,...2k (2k<=n)
质数3,可以筛掉合数6,9,12,....,3k (3k<=n)
质数5,可以筛掉合数5,10,15,....,5k (5k<=n)

有这个思想就能得到 O ( n l o g l o g n ) O(nloglogn) O(nloglogn)的算法埃氏筛
代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+10;

int f[N],idx=0;
bool st[N];

int main(){
    int n;
    cin>>n;
    st[1]=1;
    for(int i=2;i<=n;i++)
        if(!st[i]){
            f[idx++]=i;
            st[i]=1;
            for(int j=i;j<=n;j+=i) st[j]=1;
        }
    cout<<idx;
    return 0;
}

欧拉筛

欧拉筛也叫做线性筛,时间复杂度是 O ( n ) O(n) O(n)
观察埃氏筛的筛合数过程,我们可以发现,一个合数有可能被多个质数筛掉
比如,合数30,会被质数2,3,5都筛一次,这就导致了埃氏筛不是线性的,那么如何改变才能让每个合数只会被筛掉一次呢?
我们考虑一个合数y,让y最小的合数来筛掉y,例如上面的例子,只让30被2筛掉
代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+10;

int f[N],idx=0;
bool st[N];

int main(){
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        if(!st[i]) f[idx++]=i;
        for(int j=0;f[j]<=n/i;j++){
            st[f[j]*i]=true;
            if(i%f[j]==0) break;
        }
    }
    cout<<idx;
    return 0;
}

我们分析这段代码为什么能做到每个合数都会被筛掉,并且每个合数都会被其最小的质数筛掉。

数组f[]用来存i及其之前的质数
st[f[j]*i]=true;表示用质数f[j]筛掉合数f[j]*i
if(i%f[j]==0) break;来保证合数f[j]*i只会被其最小质数筛掉
解释一下原因:
i%f[j]==0说明f[j]是i的最小质数(如果不是,在进行到f[j]之前就break掉了),
i为合数,如果不break掉,那么f[j+1]*i会被f[j+1]筛掉,
但是i的最小质数是f[j],f[j+1]>f[j],f[j+1]*i的最小质数是f[j],所以要break,等待下一个合数i=(f[j+1]*i)/f[j],f[j]就能消掉f[j+1]*i。

为什么合数一定会被消掉?
合数y可以分解成=y的最小质数x*(y/x),按照算法的流程,当i==(y/x),y一定会被x消掉

为什么循环里要写f[j]<=n/i?
这个相当于f[j]*i<=n,当f[j]*i>n时,消掉的数>n,超过了我们需要的范围,无意义

为什么能保证j<idx,也就是说质数数组f里的质数用完之前一定会break掉,结束循环
这个是由i来决定的,
如果i为质数:那么在进入第二层循环之前i就被添加到数组f中了,
也就是说i为质数的话,会在最后一次被自己筛掉。
如果i为合数:那么i一定会在自己最小的质数x处break掉,
所以质数数组f里的质数用完之前一定会break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习知识经验分享之五:R语言安装

python语言用于深度学习较为广泛&#xff0c;R语言用于机器学习领域中的数据预测和数据处理算法较多&#xff0c;后续将更多分享机器学习数据预测相关知识的分享&#xff0c;有需要的朋友可持续关注&#xff0c;有疑问可以关注后私信留言。 目录 一、R语言介绍 二、R语言安装…

装饰器模式:实现类功能的动态扩展

一&#xff0c;简介 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许在不修改原有类结构的情况下&#xff0c;给一个对象动态添加额外的职责。通常情况下&#xff0c;扩展一个类的功能我们首先会想到用继承方式来实现&#xff0c…

7步搞懂手写数字识别Mnist

大家好啊&#xff0c;我是董董灿。 图像识别有很多入门项目&#xff0c;其中Mnist 手写数字识别绝对是最受欢迎的。 该项目以数据集小、神经网络简单、任务简单为优势&#xff0c;并且集合了CNN网络中该有的东西&#xff0c;可谓麻雀虽小&#xff0c;五脏俱全。 非常适合新手…

Fourier分析入门——第12章——Fourier变换的性质

目录 第12章 Fourier变换的性质 12.1 引言 12.2 Fourier变换性质的相关定理 12.2.1 线性定理(Linearity) 12.2.2 伸缩性定理(Scaling) 12.2.3 时间/空间平移定理(Shift) 12.2.4 频移定理 12.2.5 调制定理(Modulation) 12.2.6 微分定理(Differentiation) 12.2.7 积分定…

冒泡排序详解(Bubble Sort)

本文已收录于专栏 《算法合集》 目录 一、简单释义1、算法概念2、算法目的3、算法思想4、算法性质 二、核心思想构建排序 三、图形展示宏观展示微观展示 四、算法实现实现思路代码实现客户端调用构造堆的方法元素交换的方法元素比较的方法 运行结果 五、算法描述1、问题描述2、…

数据库管理-第七十八期 记第一次数据库吐槽大会(20230530)

数据库管理 2023-05-30 第七十八期 记第一次数据库吐槽大会1 主席2 三六九等3 数据库吐槽大会总结 第七十八期 记第一次数据库吐槽大会 昨天晚上终于还是把Exadata X9M-2和之前用于展示RAC搭建及升级的那套库做好了ADG&#xff0c;这部分操作在整理后会在下个月发出来。因为之…

Python列表类型的使用

文章目录 Python中的列表类型一、列表的常用操作二、列表的增删改查三、列表常用的函数 Python中的列表类型 将各个元素用方括号&#xff08;[]&#xff09;括起来&#xff0c;用逗号&#xff08;,&#xff09;分隔开&#xff0c;这种形式的数据类型就是列表。各个元素的数据类…

HNU-电子测试平台与工具2-串口实验5次

计算机串口使用与测量 【实验属于电子测试平台与工具】 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 0.环境搭建 在实验开始之前,安装好Ubuntu 20.04操作系统。(这个没有难度) 但要提醒的是,这个ubuntu是xubuntu,而且虚拟硬盘只有10GB的大小…

智警杯1.4---excel可视化

视频要点&#xff1a; 首先就是有数据透视表 点击数据透视表&#xff0c;分析&#xff0c;字段项目&#xff0c; 切片器筛选 切片器&#xff08;我希望用什么对数据进行一个筛选&#xff09; 跟下拉列表有点像&#xff0c;只不过切片器仅仅之对于数据透视表 依旧需要用su…

HBase集群搭建

hbase 1.解压HBase安装包 先 下载HBase压缩包&#xff0c;并解压安装文件&#xff0c;示例代码如下&#xff1a; tar -zxvf hbase-2.0.1-bin.tar.gz2. 修改配置文件 编辑 conf目录下的 hbase-env.sh文件&#xff0c;示例代码如下&#xff1a; cd conf vi hbase-env.sh添加…

压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法

压缩感知系列博客&#xff1a;压缩感知入门①从零开始压缩感知压缩感知入门②信号的稀疏表示和约束等距性压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法 文章目录 1. Problem2. 仿真结果3. MATLAB算法4. 源码地址参考文献 1. Problem 信号压缩是是目前信息处理领域非…

Frame Pacing

Frame Pacing是每个游戏都要遇到的问题&#xff0c;这里面有很多细节值得探讨。 为什么需要做Frame Pacing&#xff1f; 从我们的游戏线程渲染一帧到最终屏幕上绘制出一帧不是一个概念&#xff0c;这种间会经历CPU&#xff0c;GPU&#xff0c;屏幕合成器等多个角色的协同工作&a…

【xv6操作系统】安装、运行与调试

一、构建、装入过程 1.编写“启动代码主体代码”&#xff08;在下载的xv6的原始代码上进行修改&#xff09; 2.源代码进行编译、链接生成系统镜像&#xff08;elf格式的目标文件&#xff09; 3.将系统镜像保存起来&#xff08;如保存到磁盘、flash或者网络服务器上&#xff…

上海斯歌K2 x 赛博威 | 战略合作深度交流暨签约仪式

2月16日&#xff0c;上海斯歌K2与赛博威进行了战略合作深度交流&#xff0c;并在赛博威广州科学城办公室举办战略合作签约仪式。 为满足客户在数智化建设过程中的多元化需求&#xff0c;上海斯歌K2与赛博威曾多次产生交集。凭借双方多年合作的良好基础&#xff0c;自2022年始&a…

【C++】右值引用和移动语义(详细解析)

文章目录 1.左值引用和右值引用左值引用右值引用 2.左值引用和右值引用的比较左值引用总结右值引用总结 3.右值引用的使用场景和意义知识点1知识点2知识点3知识点4总结 4.完美转发万能引用见识完美转发的使用完美转发的使用场景 1.左值引用和右值引用 传统的C语法中就有引用的…

【C++】引用 - 基本语法,注意事项,函数参数,函数返回值,本质

文章目录 1. 引用的基本语法2. 引用的注意事项3. 引用做函数参数4. 引用做函数返回值5. 引用的本质6. 常量引用 1. 引用的基本语法 作用是&#xff1a;给变量起别名 语法&#xff1a;数据类型 &别名 原名 2. 引用的注意事项 引用必须初始化引用在初始化后&#xff0c;不…

量子计算:基本概念

选了课程 《量子计算与量子信息》&#xff0c;没学过量子力学的博主实在是听不懂啊 (ㄒoㄒ) 简略整理了下 可能大概也许 明白一二都没有 的课程最开始两节的内容&#xff0c;如有错误欢迎指出 ~ ~ ~ 文章目录 矩阵论复空间中的矩阵矩阵上的运算 量子力学量子态基本假设 量子计算…

阿里云的内容识别技术可以实现哪些场景下的智能化应用?

阿里云的内容识别技术可以实现哪些场景下的智能化应用&#xff1f; [本文由阿里云代理商[聚搜云]撰写]   随着人工智能技术的快速发展&#xff0c;阿里云借助自身的技术和资源优势&#xff0c;开发了一种名为“内容识别”的技术。这项技术能够高效、准确地识别出图片、视频、…

有个规划文档,会让软件开发更有效

有个规划文档&#xff0c;会让软件开发更有效 中小企业&#xff0c;业务部门不太清楚软件生产过程 软件生产有一定的抽象和复杂性 要形成一个共识 趣讲大白话&#xff1a;要有点整体观 【趣讲信息科技181期】 **************************** 2019年整理出了一个目录框架 用在很多…

windows的cmd命令窗口介绍

1.打开cmd 1.1.方式一 左下角搜索&#xff1a;“运行” -> 打开 输入"cmd" -> 确定 1.2.方式二 直接使用快捷键 windows r 即可打开 然后输入cmd&#xff0c;点击确认 1.3.方式三 打开文件管理器&#xff0c;输入cmd&#xff0c;回车 即可在该文件路径下…