Min_25筛

news2024/11/19 15:14:57

概述

Min_25是日本一个ACM选手的ID,这个筛法是他发明的,所以称之为Min_25筛。它能在亚线性复杂度求出一类积性函数的 f f f 的前缀和,前提 是这个积性函数在质数和质数的幂位置的函数值比较好求。借助埃拉托色尼筛的思想 将原问题转化成与质因子相似的子问题,从而得到一个递推式,达到快速求解的效果。

对比其他算法

在这里插入图片描述

(绿色为 O ( n ) O(n) O(n),红色为Min_25筛,蓝色为杜教筛)
可以发现,Min_25时间复杂度尽管只快了杜教筛常数级,但终究是快的

因为Min_25筛不像杜教筛那样需要构造,所以Min_25筛的适用范围更加的广泛。

算法原理

为了方便描述,我们定义一些符号。

  • 设我们的问题是 F ( n ) = ∑ i = 1 n f ( i ) F(n)=\sum\limits_{i=1}^{n}f(i) F(n)=i=1nf(i) ;假定 f f f 是一个完全积性函数。

  • m i n p ( i ) minp(i) minp(i) 表示 i i i 的最小质因子。

  • p r k pr_k prk 表示第 k k k 个质数。

  • ∣ p r ( n ) ∣ |pr(n)| pr(n) 表示 n n n 以内的质数个数。

  • g ( n , i ) g(n,i) g(n,i) 表示在埃拉托色尼筛中,前 i i i 个筛完后,剩下的数的 f f f 值之和。即质数和最小质因子大于 p r i pr_i pri 的合数。

则有
g ( n , i ) = ∑ ( j ∈ P r i m e ) ∨ ( m i n p ( j ) > p r i ) f ( j ) g(n,i)=\sum\limits_{(j\in Prime)\lor(minp(j)>pr_i)}f(j) g(n,i)=(jPrime)(minp(j)>pri)f(j)
于是可知 g ( n , ∣ p r ( n ) ∣ ) g(n,|pr(n)|) g(n,pr(n)) 表示的是做完埃氏筛之后, n n n 以内所有质数 f f f 值之和, g ( p r k , k ) g(pr_k,k) g(prk,k) 表示的是 前 k k k 个质数的 f f f 值之和(含义差不多)

发现可以用如下的递推式求出 g ( n , i ) g(n,i) g(n,i) 的值。
g ( n , i ) = { g ( n , i − 1 ) , p r i 2 > n g ( n , i − 1 ) − f ( p r i ) × ( g ( ⌊ n p r i ⌋ , i − 1 ) − g ( p r i − 1 , i − 1 ) ) p r i 2 ≤ n g(n,i)=\begin{cases}g(n,i-1),& pr_i^2> n\\g(n,i-1)-f(pr_i)\times(g(\lfloor\dfrac{n}{pr_i}\rfloor,i-1)-g(pr_{i-1},i-1))&pr_i^2\le n\end{cases} g(n,i)= g(n,i1),g(n,i1)f(pri)×(g(⌊prin,i1)g(pri1,i1))pri2>npri2n

第一行的式子很容易理解,回忆埃氏筛的方法, n n n 第一次一定是被最小质因子筛掉。 p r i 2 > n pr_i^2>n pri2>n,那么 p r i pr_i pri 不会筛掉任何数,便不会产生任何贡献。

但是第二个式子就比较难理解了,我也花了十几分钟的时间才彻底明白。
首先, g ( n , i ) g(n,i) g(n,i) g ( n , i − 1 ) g(n,i-1) g(n,i1) 而言,就是以 p r i pr_i pri 为最小质因子的数被筛掉了,那么减去的就应该是 n n n 以内以 p r i pr_i pri 为最小质因子的数。

g ( ⌊ n p r i ⌋ , i − 1 ) g(\lfloor\dfrac{n}{pr_i}\rfloor,i-1) g(⌊prin,i1) ,除去了一个 p r i pr_i pri ,得到的 ⌊ n p r i ⌋ \lfloor\dfrac{n}{pr_i}\rfloor prin n n n 以内以 p r i pr_i pri 为质因子能筛掉的数中,可能出现的除 p r i pr_i pri 以外倍数的最大值。
所以 g ( ⌊ n p r i ⌋ , i − 1 ) g(\lfloor\dfrac{n}{pr_i}\rfloor,i-1) g(⌊prin,i1) 得到的是 ⌊ n p r i ⌋ \lfloor\dfrac{n}{pr_i}\rfloor prin 以内 m i n p ( x ) ≥ p r i − 1 minp(x)\ge pr_{i-1} minp(x)pri1 f f f 值和 ∑ j ∈ P r i m e p r i − 1 f ( j ) \sum\limits_{j\in Prime}^{pr_{i-1}}f(j) jPrimepri1f(j) 之和。

但是埃氏筛时只有满足 m i n p ( x ) ≥ p r i − 1 minp(x)\ge pr_{i-1} minp(x)pri1 的才会被筛掉啊,所以得把 ∑ j ∈ P r i m e p r i − 1 f ( j ) \sum\limits_{j\in Prime}^{pr_{i-1}}f(j) jPrimepri1f(j) 给加回来, ∑ j ∈ P r i m e p r i − 1 f ( j ) \sum\limits_{j\in Prime}^{pr_{i-1}}f(j) jPrimepri1f(j) 即为 g ( p r i − 1 , i − 1 ) g(pr_{i-1},i-1) g(pri1,i1)

这样它们再乘一个 p r i pr_i pri ,则得到 n n n 以内的最小质因子等于 p r i pr_i pri 的合数的 f f f 值。注意这里,要求 f f f 是一个完全积性函数,才能把 f ( p r i ) f(pr_i) f(pri) 提取出来。但是 f f f 不一定是一个积性函数啊?带着疑问继续往下看。


注意这个递推式,它的初始条件是什么呢?是 g [ n ] [ 0 ] g[n][0] g[n][0] ,而 g [ n ] [ 0 ] g[n][0] g[n][0] 的意义正是还没有开始进行埃氏筛时的 f f f 值之和。这个值是我们需要去求的,怎么可能拿来做初始值呢?

其实这里的 g [ n ] [ 0 ] g[n][0] g[n][0] 里,并不是真正的 f f f 值之和,假设它为 f ′ f' f 。在质数和质数的幂的位置, f ′ = f f'=f f=f;而其他位置不一定, f ′ f' f 出现的目的,只是因为这里需要一个完全积性函数,而原来的 f f f 虽然是一个积性函数,但不是完全积性函数。于是用 f ′ f' f 去代替 f f f。这样,前面的递推式就成立了。

有时候题目中的 f f f多项式,我们可以将它拆开,这样每一项都是一个幂的形式,而幂是完全积性函数。这样对每一项通过 g g g 的递推式去求,求出后再求和即可。


怎么实现呢?

注意到第二维是可以滚动的,所以空间上可以省掉第二维;有因为 ⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ \left\lfloor\dfrac{\lfloor\frac{n}{a}\rfloor}{b}\right\rfloor=\lfloor\dfrac{n}{ab}\rfloor ban=abn,这说明递归下去求的所有 g g g 值,都在数论分块的 2 n 2\sqrt{n} 2n 个值中。所以我们一开始就把 2 n 2\sqrt{n} 2n 个值先存下来,然后在上面进行滚动。


现在进入正题,上面的都是预处理。

S ( n , i ) S(n,i) S(n,i) 表示 n n n 以内的最小质因子大于 p r i pr_i pri 的数的 f f f 值之和。
则有 S ( n , i ) = g ( n , ∣ P ∣ ) − g ( p r i , ∣ P ∣ ) + ∑ j > i ∑ p r j k ≤ n f ( p r j k ) × ( S ( ⌊ n p r j k ⌋ , j + [ k > 1 ] ) S(n,i)=g(n,|P|)-g(pr_i,|P|)+\sum\limits_{j>i}\sum\limits_{pr_j^k\le n}f(pr_j^k)\times(S(\lfloor\frac{n}{pr_j^k}\rfloor,j+[k>1]) S(n,i)=g(n,P)g(pri,P)+j>iprjknf(prjk)×(S(⌊prjkn,j+[k>1])

这里有同学提出过问题,为什么不能把 g ( n , ∣ P ∣ ) − g ( p r i , ∣ P ∣ ) g(n,|P|)-g(pr_i,|P|) g(n,P)g(pri,P) 去掉,将 [ k > 1 ] [k>1] [k>1] 改成 [ k ≥ 1 ] [k\ge1] [k1] 呢?
可以是可以的,但是就必须要把 n n n 以内所有的质数都枚举出来
那 O(n) 的时间复杂度和直接暴力求前缀和有什么区别?

我们最终要求的值为 S ( n , 0 ) + f ( 1 ) S(n,0) + f(1) S(n,0)+f(1)。(加上 f ( 1 ) f(1) f(1) 是因为1没有质因子,不会被 S ( n , 0 ) S(n,0) S(n,0) 所包括)。

观察上述的递推式,其中的两项已经求出来了,最后的那一项有两个求和号,分别枚举质因子以及质因子的次数,注意此处根据“递归下去求的所有 g g g 值,都在数论分块的 2 n 2\sqrt{n} 2n 个值中”,要求的质因子为 n \sqrt n n 以内的质因子,所以枚举的总次数大约是: n ln ⁡ n × ln ⁡ n \sqrt{\dfrac{n}{\ln n}}\times\ln n lnnn ×lnn,而 S ( ⌊ n p r j k ⌋ ) S(\lfloor\dfrac{n}{pr_j^k}\rfloor) S(⌊prjkn⌋)中的参数,也是在 n n n 的数论分块的 O ( n ) O(\sqrt n) O(n ) 个值以内。

分析时间复杂度

T ( n ) T(n) T(n) 表示上述递推式的时间复杂度,则有:
T ( n ) = O ( n ln ⁡ n × ln ⁡ n ) + ∑ p r j k T ( ⌊ n p r j k ⌋ ) T(n)=O(\sqrt{\dfrac{n}{\ln n}}\times\ln n)+\sum\limits_{pr_j^k}T(\lfloor\dfrac{n}{pr_j^k}\rfloor) T(n)=O(lnnn ×lnn)+prjkT(⌊prjkn⌋)

= O ( n ln ⁡ n × ln ⁡ n ) + 1 ln ⁡ n ∑ i = 2 n T ( ⌊ n i ⌋ ) =O(\sqrt{\dfrac{n}{\ln n}}\times\ln n)+\dfrac{1}{\ln n}\sum\limits_{i=2}^{n}T(\lfloor\dfrac{n}{i}\rfloor) =O(lnnn ×lnn)+lnn1i=2nT(⌊in⌋)

= O ( n ln ⁡ n × ln ⁡ n ) + 1 ln ⁡ n ∑ i = 2 n O ( n i ln ⁡ ( n i ) × ln ⁡ ( n i ) ) =O(\sqrt{\dfrac{n}{\ln n}}\times\ln n)+\dfrac{1}{\ln n}\sum\limits_{i=2}^{n}O(\sqrt\dfrac{\frac{n}{i}}{\ln(\frac{n}{i})}\times\ln(\frac{n}{i})) =O(lnnn ×lnn)+lnn1i=2nO(ln(in)in ×ln(in))

= O ( n ln ⁡ n × ln ⁡ n ) + 1 ln ⁡ n ∑ i = 2 n O ( i ln ⁡ ( i ) × ln ⁡ ( i ) + n i ln ⁡ ( n i ) × ln ⁡ ( n i ) =O(\sqrt{\dfrac{n}{\ln n}}\times\ln n)+\dfrac{1}{\ln n}\sum\limits_{i=2}^{\sqrt n}O(\sqrt\dfrac{i}{\ln(i)}\times\ln(i)+\sqrt\dfrac{\frac{n}{i}}{\ln(\frac{n}{i})}\times\ln(\frac{n}{i}) =O(lnnn ×lnn)+lnn1i=2n O(ln(i)i ×ln(i)+ln(in)in ×ln(in)

≥ O ( n ln ⁡ n × ln ⁡ n ) + 1 ln ⁡ n ∑ i = 2 n O ( n ln ⁡ n 4 ) \ge O(\sqrt{\dfrac{n}{\ln n}}\times\ln n)+\dfrac{1}{\ln n}\sum\limits_{i=2}^{\sqrt n}O(\sqrt[4]{n\ln \sqrt n}) O(lnnn ×lnn)+lnn1i=2n O(4nlnn )

= O ( n ln ⁡ n × ln ⁡ n ) + O ( n 3 4 ln ⁡ n × ln ⁡ n 4 ) =O(\sqrt{\dfrac{n}{\ln n}}\times\ln n)+O(\dfrac{n^{\frac{3}{4}}}{\ln n}\times\sqrt[4]{\ln \sqrt{n}}) =O(lnnn ×lnn)+O(lnnn43×4lnn )

= O ( n 3 4 ln ⁡ n ) =O(\dfrac{n^\frac{3}{4}}{\ln n}) =O(lnnn43)

例题

【模板】Min_25筛

简单的函数

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

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

相关文章

华为PIM-SM 动态RP实验配置

目录 建立PIM SM邻居 配置DR 配置动态RP 组成员端DR上配置IGMP 配置PIM安全 配置SPT切换 配置Anycast RP 配置接口的IP地址,并配置路由协议使得全网互通 建立PIM SM邻居 AR5操作 multicast routing-enable 开启组播路由转发功能 int g0/0/0 pim sm …

MacOS对文件夹加密的方法

背景 MacOS没有那种类似于windows那种对文件夹加解密的软件,MacOS自带有一种加解密,但是其实使用体验上跟windows那种很不一样。 win上的加解密都很快,就好像仅仅对文件夹进行加解密(我估计是安全性较低的,因为加密过…

【JavaSE】异常的初步认识

目录 1、初步认识异常 1、算数异常 2、空指针异常 3、数组越界异常 2、异常的结构体系 3、异常的分类 1、编译时异常/受查异常 2、运行时异常/非受查异常 4、异常的处理 1、处理异常的编程方式(防御式编程) 1、事前防御性(LBYL&a…

【软件测试】软件测试基础知识

1. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求 2. 调试与测试的区别 目的不同 调试:发现并解决软件中的缺陷测试:发现软件中的缺陷 参与角色不同 调试:开发人员测试:测试人员,开发人员等&a…

软件测试复习04:动态测试——黑盒测试

作者:非妃是公主 专栏:《软件测试》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录等价划分法边值分析法错误推测法因果图法示例习题等价划分法 等价类:一个几何&#xf…

如何快速搭建自己的阿里云服务器(宝塔)并且部署springboot+vue项目(全网最全)

📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正! 文章目录📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!一、前言二、准备工作1、新手申请2、安全组设置3、修改实例4.这里可以 直接用阿里云…

【图像处理OpenCV(C++版)】——4.2 对比度增强之线性变换

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

【数据结构】5.7 哈夫曼树及其应用

文章目录前言5.7.1 哈夫曼树的基本概念哈夫曼树的特点5.7.2 哈夫曼树的构造算法哈夫曼树的构造过程哈夫曼算法的实现算法思路算法实现5.7.3 哈夫曼编码哈夫曼编码思想前缀编码哈夫曼编码哈夫曼编码的性质哈夫曼编码的算法实现文件的编码和解码前言 编程:将学生的百…

【精品】k8s(Kubernetes)由基础到实战学法指南

轻松快速学会k8s四招 图1 k8s四招 学完本篇,您会获得什么惊喜? 从初学k8s,到帮助别人学会的过程中,发现朋友们和我,并非不努力,而是没有掌握更好的方法。有方法可让我们学的更快更轻松,这篇文章,以一个networkpolicy的题目,来逐步讲解,帮助大家建立一种,自己可以根…

深入了解延迟队列 DelayQueue

1. 前言 前面我们了解了基于数组,链表实现的阻塞队列,以及优先级队列。今天我们来了解下基于优先级队列的延迟队列,而且今天的内容很核心哦。 大家快搬好小板凳做好,听我慢慢分析 2. 简单实例 Task 类 public class Task implem…

数据结构(字符串)

字符串简称串,由零个或多个字符组成的有限序列,一般记为s=“a0 a1a2…an-1”,(n≥0)。其中s称作串名,用双引号括起来的字符序列是串的值。字符ai(0≤i≤n-1)可以是字母、数字或其它字…

开发第三天(Day 03)

首先对ipl.nas进行修改: ; haribote-ipl ; TAB4ORG 0x7c00 ; 这个程序被读入哪里; 以下是标准FAT12格式软盘的描述JMP entryDB 0x90DB "HARIBOTE" ; 可以自由地写引导扇区的名字 (8字节)DW 512 ; 1扇区…

【动态内存管理】-关于动态内存你只知道四个函数是不够的,这里还有题目教你怎么正确使用函数,还不进来看看??

🎇作者:小树苗渴望变成参天大树 💦作者宣言:认真写好每一篇博客 💢 作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 🎊动态内存管理&…

adrp 命令为何能获取符号的地址

疑问所在 在linux 启动时,在如下位置会将bootloader 传入的x0 - x3 参数保存到boot_args[] 变量中。代码如下: /* …

神经网络基础部件-损失函数详解

一,损失函数概述 大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变 xxx 以最小化或最大化某个函数 f(x)f(x)f(x) 的任务,我们通常以最小化 f(x)f(x)f(x) 指代大多数最优化问题。 在机器学习中,损失函数是代价函数的…

Spring Security 多过滤链的使用

一、背景 在我们实际的开发过程中,有些时候可能存在这么一些情况,某些api 比如: /api/** 这些是给App端使用的,数据的返回都是以JSON的格式返回,且这些API的认证方式都是使用的TOKEN进行认证。而除了 /api/** 这些API…

Qt扫盲-QTextEdit理论总结

QTextEdit理论总结一、概述二、用途一:富文本阅读器1. 用法2. 快捷键绑定三、用途二:编辑器1. 用法2. 拖拽3. 快捷键绑定四、常用功能五、信号一、概述 QTextEdit是一个先进的所见即所得的 富文本 查看器/编辑器,支持使用 html 风格的标签或…

【QT】.pro 文件

🌿作者:阿润菜菜 📖专栏:QT开发 .pro 文件是什么 .pro就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件。类似于VS中的.sln 和vsproj文件 默认情况下,每个 Qt 项目都包含一个后缀名为…

Huffman编码实现文件的压缩和解压缩

一个项目,不过处理起来也比较麻烦,配套可以和文件传输放一起 前提知识: 哈夫曼树和哈夫曼编码的概念和构建 1:n个数构成的哈夫曼树一共有2*n-1个结点>8 -> 15 2:数字越大的数离根节点越近,越小的数离…

无线耳机跑步会不会掉、最适合跑步用的耳机排名

现在,喜欢运动的人越来越多了。大家都有体会,多数运动是相对枯燥的,在运动时听听音乐,那是多么惬意的事情啊。为此,体验过多款耳机,但令我很满意的甚少。相信不少喜欢运动的朋友都有着跟我一样的烦恼吧&…