Min_25筛详解

news2024/12/26 12:05:08

概述

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/164720.html

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

相关文章

Allegro如何导出和导入设计规则操作指导

Allegro如何导出和导入设计规则操作指导 当需要借用另外一款PCB的设计规则时候,Allegro支持把PCB设计规则导入到另外一块PCB中,如下图 具体操作如下 打开规则管理器打开后如下图

2023.1.15 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.PROPOSED METHOD5.1 Problem Formulation5.2 Personalized Time Intervals5.3 Embedding Layer5.4 Time Interval-Aware Self-Attention5.4.1 Time Interval-Aware Self-attention Layer5.4.2 Causality5.4.3 Point-Wise Fe…

QT可直接安装的离线版最后版本5.14.2

以前用c#来做组态,自定义控件开发起来也还过得去,但QT的控件和graphics view貌似更有优势,个人观点吧!工控领域的组态用上QT还是不错的选择。 从2000前开始使用qt,算起来也有20多年了。个人感觉用起来最顺手的应该时Q…

【PHP】一文详解如何连接Mysql数据库(附源码)

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

24考研——专业院校选报指南(3步决定专业选择、11大类本科对应考研专业简析、6步决定目标院校)

文章目录一、专业选择指导1.1 考研整体形势1.2 考研专业选报1.2.1 专业设置1.2.2 专硕专业设置1.2.3 专业代码含义1.2.4 区分“学硕和专硕”1.2.5 专业选择步骤(跨专业考研难度)1.2.6 跨专业考研简析(法硕/教育/会计、审计、图书情报/思想政治…

汇编【王爽】实验3、4

实验3 编程、编译、链接、跟踪 assignment 1 编译链接生成可执行文件 assignment 2 debug将程序载入内存,设置CS:IP:程序所在内存段的段地址为DS075CDS075CDS075C,则PSP的地址为075C:0075C:0075C:0,程序的地址为076C:0(075C1…

C++ 初了解模板

一. 泛型编程 我们若是想实现一个需要对各类数据通用的功能,在C语言中是不太现实的,而在C中,我们可以运用函数重载,但我们依然需要写出多个内容极其类似的函数,例如想要实现交换 void Swap(int& a, int& b…

2022这特殊的一年,再见!

望着窗外的夕阳以及还未完全融化的积雪,我想是时候给这特殊的一年写篇总结了。于是我翻看了2021年的,发现文末所定的2022年目标。终于明白为什么老人不玩手机可以坐一下午了,因为往事回想起来就和电视连续剧一样。年初参加了开运跑&#xff0…

【UE】pak的mount(带源码解析)

本文使用的引擎版本为UE4.27 为了方便理解,文中选取的代码均为部分截取,只截取与小节相关的部分 文章目录概述几个涉及到的结构Mount时机pak读取优先级目录优先级根据文件名定优先级综上所述概述 正常的散文件加载是使用FFileHelper::LoadFileToArray等…

【阶段四】Python深度学习06篇:深度学习项目实战:卷积神经网络进行狗狗图像分类项目

本篇的思维导图: 项目背景 应用Keras框架构建卷积神经网络进行狗狗图像分类的预测,以及模型的优化。主要用来熟悉Keras卷积层、池化层网络的使用以及模型的优化方法。 数据获取 本次建模数据来源于网络,数据项统计如下: 数据集为狗狗数据集,来自全国各地的狗狗图…

算法进阶指南:第一章练习题

1.The Pilots Brothers refrigerator 牛客竞赛-The Pilots Brothers refrigerator 116. 飞行员兄弟 - AcWing题库 开关问题的特点是每个开关只会作用某个特定范围,所以每个开关最多操作一次,且操作先后次序对最后结果无影响。用16位二进制存储状态&am…

Unity 过场工具(Cutscene)设计(一)

Unity 过场工具(Cutscene)设计(一) 游戏中通常会涉及到过场内容的制作,从而来进行一些强表现,从而来进行剧情相关的串联,使游戏表现类容更丰富。比较典型的游戏 像原神,天刀等等游戏。 过场工具制作选择 过…

Java程序设计实验2 | Java语言基础(1)

*本文是博主对Java各种实验的再整理与详解,除了代码部分和解析部分,一些题目还增加了拓展部分(⭐)。拓展部分不是实验报告中原有的内容,而是博主本人自己的补充,以方便大家额外学习、参考。 目录 一、实验…

写在壬寅年末,2023年春节

先回顾过去几年写过的年末总结写在戊戌年末,2019年春节写在己亥年末,2020年春节写在庚子年末,2021年春节写在辛丑年末,2022年春节又一个农历年即将过去,写下这样的年末总结,已经是第5年,于是便有…

Nginx面试题(史上最全 + 持续更新)

尼恩面试宝典专题39:Nginx面试题(史上最全、持续更新) 本文版本说明:V27 《尼恩面试宝典》升级规划为: 后续基本上,每一个月,都会发布一次,最新版本,可以联系构师尼恩…

本周大新闻|传苹果MR开发样机已送出,比尔盖茨:不太看好Web3和元宇宙

本周大新闻,AR方面,苹果软件曝光“Reality OS”和“xrOS”;IVAS项目仅获批4000万美元;比尔盖茨:不太看好Web3和元宇宙;DigiLens工业AR眼镜ARGO;Kopin拆分部分OLED部门;LetinAR展示塑…

【Linux】gcc/g++的使用

这里写目录标题🚖gcc如何使用🚖函数库🌈动态库和静态库🚖gcc如何使用 ✒️预处理 预处理功能主要包括宏定义、文件包含、条件编译、去掉注释 实例: gcc -E myfile.c -o myfile.i “-E(大写)”&…

JVM(二)——参数调优

JVM参数调优 前言 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认值 使用jps和jinfo进行查看 -Xms:初始堆空间 1/64 -Xmx:堆最大值 1/4 -Xss:栈空间-Xms 和 -Xmx最好调整一致,防止JVM频繁进行收集和…

微信小程序项目实例——摇色子

微信小程序项目实例——摇色子 文章目录微信小程序项目实例——摇色子一、项目展示二、核心代码三、效果图文末项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 摇色子是一款简易的游戏类小程序 用户可以投出1-9个色子 二、核心代码 dice.wxml <!--pages/dic…

编解码标准-H.264

H.264是MPEG-4家族中的一员&#xff0c;即MPEG-4系列文档ISO-14496的第10部分&#xff0c;因此被称作MPEG-4 AVC&#xff0c;MPEG-4重点考虑灵活性和交互性&#xff0c;而H.264着重强调更高的编码压缩率和传输的可靠性。 1、H.264 编码流程 1.1、slice&block 第一步&…