关于min_25筛的一些理解

关于min_25筛的一些理解

如果想看如何筛个普通积性函数啥的,就别往下看了,下面没有的(QwQ)。
下文中,所有的p都代表质数,P代表质数集合。
注意下文中定义的最小/最大质因子都是默认所有质因子本质不同。
223455的最小/次小质因子都是2,最大/次大质因子都是5

step1. 适用条件与思想

min_25筛用于求积性函数前缀和,即i=1nf(i)
min_25筛相比于传统筛法来说(如莫比乌斯反演、杜教筛),更加灵活,也没有什么定式套路。
很多时候其实可以直接看成一个dp的模型。
这个模型可以解决很多关于质因子贡献的问题。
它的适用条件:

  • f(p)可以表示为简单多项式
  • f(pk) 可以快速求。

第一个条件还蛮严苛的。
min_25筛的思想感觉还是非常有用:筛出质数的f =====> 筛出所有数的f
其中筛质数时,用总答案减去不合法 ; 筛所有数的时候,直接正向计算所有的答案。

step2. 筛质数的答案

min_25筛分两步走,首先对于所有N=nx 筛出i=1N[iP]f(i)
把小于等于根号n的质数筛出来构成P集合。
又因为f(p)可以表示为简单多项式,所以:

i=1N[iP]f(i)=i=1N[iP]k=0infcoefkik=k=0infcoefki=1N[iP]ik

所以我们要求的东西其实是i=1n[iP]ik
这个东西怎么求网上博客都写的很清楚了,设g(n,j)=i=1n[iP or pmin(i)>pj]f(i)
然后按照j分层处理,得到:

g(n,j)=g(n,j1)pjk(g(npj,j1)g(pj1,j1))

其中pj2n
显然,因为我们把所有数的f都当成质数的方法来算,所以只有g(n,P)是真的,其他g都是假的。
不过没有关系,反正后面的筛法中也只需要用到g(n,P)
但是我们也可以利用这些假的g来搞事情。
这个过程如果深入来看是什么呢?就是那个丑的不行的O(ln)埃式筛
j次操作后,剩余集合的f之和就是g(n,j)
这个过程是怎么实现的呢?观察上式右半部分,
我们每次计算了最小质因子等于当前枚举因子pj的函数值之和,然后把它去掉。
这可以看作 用最小质因子pj标记了这些合数,注意是合数!
所以如果需要求一些关于最小质因子的东西的合数前缀和时,我们就可以在这里做手脚了。

光说不做假把式,求i=1n[iP]r(pmin(i))i,其中r(x)为一个关于x的函数。
咋做?
我们直接筛i=1n[iP]i这个东西,但光筛这个是不行的,因为还要加上r(pmin(i))的贡献。
注意到我们每次删去合数的答案时,我们是用最小质因子pmin(i)标记的。
所以每一层j中,
h(j)=pj(g(npj,j1)g(pj1,j1))不就是以pj为最小质因子的合数除掉pj后的和吗?
当计算g(n,j)的时候,在每一层直接加上r(pj)h(j)即可。

如果是求质数前缀和的话......
这个东西原本的作用不就是筛质数的函数值吗?
如果是求所有数前缀和的话......
喂喂喂,把质数的加上合数的不就是所有数了吗?
还有边界问题,g(n,0)=i=2nik,经典问题人人都会,差分或插值弄一下就行了。
这部分的复杂度是O(n34logn),原因未知。

step3. 筛所有数的答案

对于后半部分,
S(n,j)=i=1n[pmin(i)pj]f(i),等于把iP的条件删掉。
推导什么的咕咕咕网上都有。

  • 质数部分答案:g(n,P)k=1j1f(pk)
  • 合数部分答案:k=j|P|e=1pke+1n[f(pke)S(npke,k+1)+f(pke+1)]

最后那个尾巴f(pke+1)是因为形如f(pk)的函数值在计算中被咕咕咕了所以要补上。
这个过程可以发现一个非常有意思的事情。
对于任意一个数n,我们计算到它步骤是:质因子从小往大枚举所以:

  • 1.pj1一定是当前数所包含的上一个质因子。
  • 2.它最大的一个质因子一定是最后枚举到的部分。

所以如果我们求一些与最大/次大质因子有关的东西的前缀和时,我们就可以在这上面做手脚了。
先看求最大质因子特殊贡献。
此时需要满足一个条件:质数的后缀贡献好求。
在求解S的过程中,我们可以强制当前这一层可选的pj...p|P|为最大质因子
这样就可以在算质数部分答案的时候,直接把最大质因子r(pmax(i))的贡献直接加上了。
当然前提是这个后缀贡献好加(说句实话很多时侯这个条件都不满足)。
然后我们就处理了形如n=wpmax的数的贡献添加。
若这个数n=wpmaxk,k>1,我们在质数答案部分是无法添加贡献的。
然而如果明白了min_25筛原理就可以发现,其实只需要在那个尾巴f(pke+1)处加上贡献就行了。
然后如果是处理次大质因子特殊贡献的话,其实还更好求了。
根据上述,我们知道在S(n,j)这个状态时,我们上一层选择的质因子一定是pj1
所以类似的强制当前层选择的p为最大质因子,然后使用pj1在当前层做特殊贡献。
当然注意要特判这个数形如wpmaxk,k>1的情况,此时在那个尾巴出处理一下即可。
还能干其它的吗?
可以。
注意到对于一个数,我们在每一层枚举的是一个本质不同的质因子。
所以我们还可以处理与特定质因子有关的前缀和计算。
当然注意时刻要记得质数的部分特殊处理,所以筛g的时候也要特殊处理一下特定质因子。
即那些特殊质因子在g中的贡献也得是它们特殊形式的贡献。
处理g中的特殊质因子可以按照以下步骤:

  • 把特殊质因子全部拿出来排序,求它们原本形式的f、特殊形式的f的前缀和。
  • 按照一般方法把g给求出来。
  • 对于每个g,二分得到其包含的特殊质因子范围,用前缀和把原来答案减掉,新答案加上。

光说不练假把式。

例:求i=1n[gcd(i,K)=1]μ(i) , 其中n1010

说实话如果不是学了min_25筛,我这辈子都不会觉得这玩意能求。
知道了上面的套路后,这个东西就变得很简单了,
原式即i=1nμ(i)减去包含某些特定质因子的数的贡献,直接在min_25筛的后半部分判一下就行了。
简单吧......

这部分的复杂度是O(npoly(logn)),原因同样未知。

总结

min_25筛除了可以筛积性函数前缀和外,还有许多其他应用。
min_25筛在处理与数的因子有关的前缀和计算时,有奇效,非常的好用。
常见模型都包含在上文中了:

  • 筛某积性函数前缀和 (标准形式模板题)
  • 处理"最小质因子特殊贡献"前缀和 (第一部分求g变形)
  • 处理"最大值因子/次大质因子特殊贡献"前缀和。 (第二部分求S变形)
  • 处理"特定质因子特殊贡献"前缀和。 (第一部分求g特殊处理,第二部分求S变形)

这玩意儿这么灵活感觉可以放肆出题啊.......迟早要完......瑟瑟发抖......
就酱(QwQ)。

posted @   GuessYCB  阅读(4414)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示