筛法(线性筛,厄拉多塞筛)

news/2024/5/6 16:09:38/文章来源:https://blog.csdn.net/cyyyyds857/article/details/128167965

在前前前前前前…的博客中,我们主要谈了欧拉筛和埃氏筛.

今天我们主要来聊一聊线性筛和厄拉多塞筛(其实和埃氏筛和欧拉筛本质上没区别哎).其实在这两种筛法中厄拉多塞筛最好懂(就连本蒟蒻一看代码就明白了…别看这个名字,容易糊弄人)

首先是厄拉多塞筛"粉墨登场":::::::

厄拉多塞筛

厄拉多塞是个人名,因为这种筛法是他提出来的.

我们先讲一下大致的思路,我们example(举个栗子):

有一张写了2~n之间所有数的表,其中就包括这2和n.然后,我们从2开始一直到n划掉2的倍数.划完之后,我们发现3没有被划去,就证明3是质数,然后我们就在3~n当中划去是3倍数的数,以此类推.

此时,厄拉多塞筛的时间复杂度为O(n+\frac{n}{2}+\frac{n}{3}+\frac{n}{4}+...+)=O(n log log n)

既然已经动了厄拉多塞筛的筛质数的方法,我们下面来就有请我们最喜欢的代码大军:

void ispri(){cin>>n>>m;a[1]=1;for(i=n;i<=m;i++){if(a[i]==1){continue;}else{for(j=2*i;j<=m;j+=i)a[j]=1;}}for(i=n;i<=m;i++){if(a[i]==0)cout<<i<<" ";}return;
}

既然代码大军都已经出来了,我们就接着奔赴下一个战场,线性筛

线性筛

由于厄拉多塞筛在筛30=2*3*5类似于这些数的时候,会被2,3,5重复多筛几次,这样就大大耗费的时间复杂度,因此,我们推出了新产品––线性筛.

线性筛的思路就是要保证每一个数都被他的最小质因子筛去.

首先,我们先亮出代码:

void ispri(){for(int i=2;i<=n;i++){if(isp[i]==0) pr[++cnt]=i;for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1if(i%pr[j]==0) break;}}
}

保证每一个数只被他的最小的质因子筛去,代码中则体现在了i%pr[j]==0上面 

pr数组中的质数是递增的,当pr[j]|i时,pr[j]|pj[j+1]i,那么pj[j+ 1]i这个合数应该被pr[j]这个更小的质数筛掉。另外,当pr[j]|i时,pr[j]是i的最小质因子。否则pr[j]是pr[j]i的最小质因子。

我们沿用线性筛的过程,考虑这个问题。首先,线性筛筛出质数的时候,我们需要求这个积性函数在质数处的取值。其次,在for循环中,设k=pr[j],当k|i时,由上面的讨论,k是i的最小质因子,设k在i中的幂次为a,那么

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        f[ki]=\frac{f(k^{a+1})}{f(k^{a})}f(i)

否则,因为k是质数,那么gcd(k, i) = 1,那么f(ki) =f(k)f(i)。

懂了吗?我们来看下一步

线性筛欧拉函数

例:O(n)求出欧拉函数在1∼n处的所有取值。

由于\frac{\varphi (k^{a+1})}{\varphi (k^{a})}=k,为一个定值,所以线性筛欧拉函数很容易。

代码如下:

for(int i=2;i<=n;i++){if(isp[i]==0){pr[++cnt]=i;phi[i]=i-1;}for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1;if(i%pr[j]==0){phi[i*pr[j]]=phi[i]*pr[j];break;}phi[i*pr[j]]=phi[i]*(pr[j]-1);}
}

线性筛莫比乌斯函数

例:O(n)求出莫比乌斯函数在1∼n处的所有取值。

由于\frac{\mu (k^{a+1})}{\mu(k^{a})}=0,为一个定值,所以也很容易。

for(int i=2;i<=n;i++){if(isp[i]==0){pr[++cnt]=i; mu[i]=-1;}for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1;if(i%pr[j]==0) {mu[i*pr[j]]=0;break;}mu[i*pr[j]]=mu[i]*-1;}
}

线性筛求约数个数

例:O(n)求出约数个数函数τ在1∼n处的所有取值。

由于\frac{\tau (k^{a+1})}{\tau (k^{a})}=\frac{a+2}{a+1},不为一个定值,所以在筛的过程中还要维护i的最小质因子的次数。

for(int i=2;i<=n;i++){if(isp[i]==0){pr[++cnt]=i; tau[i]=2; g[i]=2;}for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1;if(i%pr[j]==0){tau[i*pr[j]]=(g[i]+1)*tau[i]/g[i];g[i*pr[j]]=g[i]+1;break;}tau[i*pr[j]]=tau[i]*2;g[i*pr[j]]=2;}
}

今天的内容终于讲完了,感谢大家的聆听

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某农业学校 算法设计与分析-第五次实验-回溯算法

1. 罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个mn的迷宫中&#xff0c;如图所示。每一个方格表示迷宫中的一个房间。这mn个房间中有一些房间是封闭的&#xff0c;不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗…

深度学习常见概念字典(感知机、全连接层、激活函数、损失函数、反向传播、过拟合等)

这一章的所有内容均是为了进入深度学习具体的某某网络而准备的&#xff0c;简单但是非常有必要。 1. 神经网络&#xff08;neural networks&#xff09;的基本组成 1.1 神经元&#xff08;neuron&#xff09; 神经元&#xff08;neuron&#xff09; 是神经网络&#xff08;n…

Djiango实现用户管理增删改成功能实战

1.0定义 前后端不分离模式 前后端分离是指前端页面看到的效果都是由后端控制&#xff0c;即后端渲染HTML页面&#xff0c;前端与后端的耦合度比较高 前后端分离模式 后端仅返回前端所需要的数据&#xff0c;不在渲染HTML页面&#xff0c;不在控制前端的效果&#xff0c;至…

CodeQL代码静态污点分析引擎排查漏洞模式

文章目录前言环境搭建1.1 codeql基础1.2 vscode插件1.3 生成数据库1.4 HelloWorldcodeql语法2.1 语法结构2.2 常用类库2.3 谓词介绍2.4 污点分析漏洞检测3.1 初步结果3.2 解决误报总结前言 对于代码审计的工作&#xff0c;最早期的安全人员会以人工审计的方式来审计项目代码&a…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.1 消息的可靠投递 7.1.1 confirm【确认模式】

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.1 消息的可靠投递7.1.1 confirm【确认模式】第二天 高级 7 RabbitMQ 高级特性 7.1 消息的可靠投递 7.1.1 confirm【确认模式】 在使用 Ra…

【数据预处理】基于Pandas的数据预处理技术【california_housing加州房价数据集】_后9个任务

文章目录一.需求分析二.需求解决2.1 对第一个特征&#xff08;收入中位数&#xff09;排序后画散点图2.2 对第一个特征&#xff08;收入中位数&#xff09;画分位数图并分析2.3 【选做】对所有特征画分位数图并进行分析2.4 使用线性回归方法拟合第一个特征&#xff08;收入中位…

【C语言进阶】指针练习题

写在前面 这是指有关指针的小题 正文 练习一 int main() {int a[5][5];int (*p)[4];pa;printf("%p,%d", &p[4][2]-&a[4][2], &p[4][2]-&a[4][2] );return 0; } 解析&#xff1a; a[4][2]为如图粉色部分&#xff0c;p[4][2]为如图蓝色部分。a的…

Java项目:springboot药品管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目属于前后端分离的项目&#xff0c;分为两个角色药品管理员和取药处人员 药品管理员&#xff1a; 登录、退出、药品信息录入、药厂信息录入…

买不到的数目(蓝桥杯C/C++A组真题详解)

题目详细&#xff1a; 题目思路&#xff1a; 对于这个题有一个定理 如果 a,b 均是正整数且互质&#xff0c;那么由 axby&#xff0c;x≥0&#xff0c;y≥0 不能凑出的最大数是 &#xff1a; a*b-a-b 具体的证明过程这里就不赘述 感兴趣的同学可以自行查找 这里就提供一种思…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.2 Consumer Ack

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.2 Consumer Ack7.2.1 Consumer Ack7.2.2 Consumer Ack 小结7.2.3 消息可靠性总结第二天 高级 7 RabbitMQ 高级特性 7.2 Consumer Ack 7.2.…

C#语言实例源码系列-伪装文件

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

matlab神经网络求解最优化,matlab神经网络训练数据

1、神经网络的准确率是怎么计算的&#xff1f; 其实神经网络的准确率的标准是自己定义的。 我把你的例子赋予某种意义讲解&#xff1a; 1&#xff0c;期望输出[1 0 0 1]&#xff0c;每个元素代表一个属性是否存在。像着4个元素分别表示&#xff1a;是否肺炎&#xff0c;是否肝…

你可能不知道的DOM断点调试技巧

前言 作为一个前端&#xff0c;DOM断点应该是我们非常熟悉的&#xff0c;也是我们日常工作中经常要用到的一种调试技巧&#xff1b;但是下面这些DOM断点调试技巧你可能不知道&#xff0c;且听我一一道来。 监听元素 有这样一种场景&#xff0c;当DOM中某个元素移除或者元素属…

数据结构---图

&#xff08;一&#xff09; 相关知识点 图&#xff08;graph&#xff09;&#xff1a;图是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G表示一个图&#xff0c;V是图G中的顶点的集合&#xff0c;E是图G…

从模型到服务——iDesktopX处理自动化工具实现BIM模型到三维服务发布

目录前言一、 处理自动化模型二、 算子参数设置1、 使用迭代数据集打开导出后的BIM模型2、 移除重复点、重复面和重复子对象3、 模型生成缓存4、 三维切片缓存发布5、 执行结果前言 BIM模型在SuperMap实际使用的业务流程中常常需要在桌面产品中生成缓存&#xff0c;然后通过iS…

QT多窗口编程与文件IO编程

目录 一、消息对话框 QMessageBox&#xff08;掌握&#xff09; 二、常用窗口类&#xff08;掌握&#xff09; 三、主窗口类 QMainWindow&#xff08;重点&#xff09; 四、parent参数&#xff08;掌握&#xff09; 五、窗口传参 5.1 成员函数/构造函数 5.2 信号槽传参 六、事件…

Android开发进阶——binder通讯学习

什么是binder 通常意义下&#xff0c;binder指的是一种通信机制对Server端来说&#xff0c;Binder指的是Binder本地对象&#xff0c;对于Client端来说&#xff0c;Binder指的是Binder代理对象对于传输过程而言&#xff0c;binder是可以跨进程传输的对象 Binder的基本原理 Bi…

MySQL 管理

文章目录启动及关闭 MySQL 服务器MySQL 用户设置/etc/my.cnf 文件配置管理MySQL的命令启动及关闭 MySQL 服务器 首先&#xff0c;我们需要通过以下命令来检查MySQL服务器是否启动&#xff1a; ps -ef | grep mysqld如果MySql已经启动&#xff0c;以上命令将输出mysql进程列表…

node.js+uni计算机毕设项目基于微信小程序的美甲预约系统(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

Docker安装Zookeeper教程(超详细)

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…