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

news2024/11/24 23:08:03

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

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

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

厄拉多塞筛

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

我们先讲一下大致的思路,我们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]]=1
            if(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.coloradmin.cn/o/114649.html

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

相关文章

HRTransNet阅读理解

E. Dual-direction short connection fusion module HRFormer applies transformer blocks to enlarge receptive field of fused feature Frs, and uses exchange units to absorb the merits of multi-scales features. The process is described as: HRFormer使用TRM块来扩…

《教育的目的》笔记——如何让学生通过树木看见森林

目录 作者简介 个人感悟 经典摘录 1、学生所受的训练应该比他们最终投身的专业更为广泛 2、学习新语言用途 3、教师的责任 4、教育的主题 5、学到的有用之物 6、教育目的 7、所有事物都不是静态的、定型的&#xff0c;而是处于形成&#xff08;becoming&#xff09;过…

Merry Xmas | 用Matplotlib画个3D圣诞树送给你!~

1写在前面 Merry Christmas ! &#x1f973; 过完圣诞就要跨年了&#xff0c;希望2023年自己可以一扫霉运&#xff0c;顺顺利利&#xff01;&#xff01;&#xff01;&#x1f618; 从网上抄了个英文的祝福语送给大家&#xff08;主要是懒&#xff09;: &#x1f447; I hope S…

【Unity】VideoPlayer实现视频播放

【Unity】VideoPlayer实现视频播放 背景&#xff1a;开发影院场景需要在荧幕上播放视频 环境&#xff1a;Unity2021.3 VideoPlayer的简单使用&#xff1a;http://t.csdn.cn/K8665 局限&#xff1a;上述方法会使得视频播放窗口强制在相机前&#xff1b; 需求&#xff1a;视频播…

怎么看懂单片机时序图?

本人没有上过单片机相关的专业课&#xff0c;是在《计算机系统结构》里遇见的时序图。由于看不懂加之老师没有专门讲&#xff0c;因此自行查阅了相关的视频和博客。&#xff08;参考视频已放在文末&#xff09; 网上资源贫瘠&#xff0c;不过我也不需要太过深入的知识。 大家…

spring事物使用示例及原理总结

目录 事务示例 示例一 示例二 示例三 示例四 示例五 示例六 事务原理 EnableTransactionManagement 执行代理对象目标方法 事务示例 示例一 在test()方法直接调用abc()方法&#xff0c;并在test()方法添加Transactional&#xff0c;test()和abc()方法分别会更新id…

力扣刷题笔记day10(树的子结构+二叉树镜像+对称的二叉树)

文章目录树的子结构题目思路代码二叉树镜像题目思路代码对称的二叉树题目思路代码树的子结构 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 题目 思路 dfs(A, B) …

二叉树经典算法题目

1.二叉树的前中后序遍历&#xff08;简单&#xff09; 省略 2.二叉树的深度(简单) 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。 例如&a…

Biotin-PEG-MAL,Maleimide-PEG-Biotin,生物素聚乙二醇马来酰亚胺

英文名称&#xff1a;Biotin-PEG-MAL&#xff0c;Maleimide-PEG-Biotin 中文名称&#xff1a;生物素聚乙二醇马来酰亚胺 Biotin-PEG-Mal&#xff0c;聚乙二醇化生物素对亲和素或链霉亲和素有很高的亲和力。生物素/亲和素体系在生物分子检测和分离中有着广泛的应用。马来酰亚胺…

Container Station搭建个人网盘Nextcloud(Mariadb)

目录 一、Container Station 二、MariaDB安装 三、phpMyAdmin安装及nextcloud对应数据库配置 &#xff08;一&#xff09;phpMyAdmin安装 &#xff08;二&#xff09;nextcloud对应数据库配置 四、Container Station中部署nextcloud &#xff08;一&#xff09;拉取镜像…

javascript下载文件几种方式,接收后台返回流下载或直接下载文件

目录 1 javascript下载文件7中方式 1.1 window.location.href下载 1.2 window.location下载 1.3 iframe下载 1.4 form表单的形式下载 1.5 a标签的方式下载 1.6 ajax方式后台返回文件流下载 1.7 axios方法后台返回流方式下载 2.完整源码 1 javascript下载文件7中方式 1…

Discrete Optimization课程笔记(4)—前沿与工具

目录 1.大规模邻域搜索(Large Neighborhood Search) Case1: 带时间窗的非对称TSP(Asymmetric TSP with Time Windows) 2.列生成算法(Column Generation) Case2: Cutting Stock 3.优化工具汇总 1.大规模邻域搜索(Large Neighborhood Search) 大规模邻域搜索是局部搜索和CP…

linux共享内存的使用

共享内存可以由多个程序同时访问的内存&#xff0c;能够避免进程间通信过程中的冗余数据拷贝&#xff0c;是IPC中最快的一种,特别适合用来作大块数据的传输。共享内存可以映射到不同的进程空间&#xff0c;这些进程间的数据传递就不再涉及内核。这个过程其实是把同一块物理内存…

Java高效率复习-Spring[Spring]

前言 Spring的学习还是很简单的&#xff0c;到SpringMVC的时候则会比较复杂了&#xff0c;因为要创建Web项目以及一些Web因素等等。 Spring的简介 Spring入门案例 导入依赖 <packaging>jar</packaging><dependencies><!-- 基于Maven依赖传递性&#x…

[ 代码审计篇 ] Fortify 安装及使用详解(一)Fortify 下载安装并设置语言为中文导出中文报告

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

毕业5年,我买房了

持续坚持原创输出&#xff0c;点击蓝字关注我吧 都说人到30就觉得时间过的很快&#xff0c;这句话确实不假&#xff0c;2022年我已经毕业五年&#xff0c;今年下半年也终于在成都高新区购房了&#xff0c;在这里有了自己的家。 购房对于大多数人来说肯定是人生一件大事吧&…

【Maven基础】单一架构案例(三)

第六节 业务功能&#xff1a;登录 1、显示首页 1.1、流程图 1.2、创建 PortalServlet 1.2.1、创建 Java 类 public class PortalServlet extends ViewBaseServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletExceptio…

NetSuite Decode函数

昨天是平安夜&#xff0c;小家伙仍然为圣诞老人的到来准备了礼物&#xff0c;这是他的传统。每年为了感谢圣诞老人和驯鹿的到来&#xff0c;他都会准备上点心、水果。今年&#xff0c;他认为驯鹿可能需要电力&#xff0c;所以准备了电池给它们享用。 真希望天真一直伴随他的成长…

nestjs学习

某种原因开始学习nestjs&#xff0c;想用nestjs做后端&#xff0c;mongodb做数据库来实现一个微信小程序的后台&#xff0c;开始了哼哧哼哧的爬代码之路。 如果想使用自己写的js或ts工具库&#xff0c;需要使用require进行导入&#xff01;&#xff01;否则找不到文件&#xff…

平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等

平衡二叉树的插入&#xff08;在二叉排序树中插入新结点后&#xff0c;如何保持平衡&#xff09;1.平衡二叉树的定义2.平衡二叉树的插入&#xff08;调整最小不平衡子树A&#xff09;2.1LL&#xff08;在A的左孩子的左子树中插入导致不平衡&#xff09;2.2RR&#xff08;在A的右…