min_25筛(知识总结)

思路来源

https://www.cnblogs.com/cjyyb/p/9185093.html

https://www.cnblogs.com/zhoushuyu/p/9187319.html

https://www.mina.moe/archives/12287

心得

这个从去年上个月就想学的知识,终于在开学前被学会了

神仙min_25 QAQ 神仙zzt QAQ 神仙yyb QAQ

学会min_25筛比较难,但大概写一份能让初学者看懂的博客更难

然而学会之后,发现这个东西很模板,好像抄个板子改改就能过题

知识点

min_25筛,日本算竞选手min_25发明的,

一种埃筛思想的,求积性函数F(x)前缀和的,亚线性筛,

复杂度O(\frac{n^{3/4}}{log(n)}),不会证,

后来被他优化成O(n^{\frac{2}{3}})的了,但常数比较大,所以用前面这个就行

目的

\sum_{i=1}^nF(i)

F(x)需要满足条件:

1.积性函数,若ab互质,则F(ab)=F(a)*F(b)

2.F(p)是个可以用多项式表示的值

3.F(p^k)可以快速计算

为了求这个式子,根据1、质数、合数把这个式子拆成三部分

质数部分

先求质数的部分,即\sum_{i=1}^n[i\in Prime]F(i),这里不妨令F(x)=x^k

P是质数集合,P_{i}表示第i个质数。

为了求质数部分,引入g(n,j)=\sum_{i=1}^ni^k[i\in P\ or \ min(p)>P_j,p|i,p\in P\ ]

g(n,j)表示1n中,满足i是质数,或最小素因子大于第j个质数的,F(i)的和

考虑g(n,j)如何求,dp思想,最后一次决策,是加入最小素因子等于第j个质数的贡献,

所以g(n,j),是要从g(n,j-1)里,删去最小素因子等于第j个质数的贡献

 

由于满足最小素因子是P_{j}的最小的数是P_{j}^{2}

①若P_{j}^{2}>n,说明什么都没有删去,有g(n,j)=g(n,j-1)

②否则P_{j}^{2}\leq n,此时要删去最小素因子等于第j个质数的贡献,记这样的数是y=x*P_{j}

那么x的最小质因子也大于等于P_{j},就是大于P_{j-1}

首先,提一个P_{j}出来,其贡献是F(P_{j}),这里是P_{j}^{k}

再乘上x的最小质因子大于P_{j-1}的贡献,即g(\frac{n}{P_{j}},j-1)-g(P_{j-1},j-1)

前一项g(\frac{n}{P_{j}},j-1)多算了[1,\frac{n}{P_{j}}]\leq P_{j-1}的质数的贡献,后一项g(P_{j-1},j-1)则减去这个多余的贡献

整理一下,就是g(n,j)=g(n,j-1)-P_{j}^k[g(\frac{n}{P_{j}},j-1)-g(P_j-1,j-1)]

 

①、②,有

g(n,j)=\left\{\begin{matrix} g(n,j-1)&P_j^2> n\\ g(n,j-1)-P_{j}^k[g(\frac{n}{P_j},j-1)-g(P_j-1,j-1)]&P_j^2\le n \end{matrix}\right.

也即,g(n,j)=\left\{\begin{matrix} g(n,j-1)&P_j^2> n\\ g(n,j-1)-F(P_{j})[g(\frac{n}{P_j},j-1)-g(P_j-1,j-1)]&P_j^2\le n \end{matrix}\right.

 

最终,g(n,|P|)即为所求,其中|P|是小于等于n的质数集合的大小,

毕竟,min(p)>P_{|P|}的数在[1,n]里不存在

和埃筛的关系

个人感觉,就是先把所有数都当做质数,求一个和,

然后不断的用最小质因数P_{j}的出现,把那些最小质因数是P_{j}的合数从这个和中减掉,逼近最终的和,

当所有的合数都被划去时,就是真实的最终的和

 

以下段落截取自yyb大佬的博客,

根据上面的转移,需要的质数只有不大于\sqrt n的,所以只需要筛出这些质数就好了。

我们来思考一下g函数所代表的含义,

我们可以理解为在模拟埃氏筛法的过程,

g(n,j)表示[1,n]排成一列放在这里,但是你已经晒过一些质数了,

你把前j个质数的倍数全部划掉了,剩下的求个F(x)的和就是g函数。

所以转移的过程可以理解为已经筛完了前j-1个质数,现在考虑删除第j个质数的过程。

看到这里一定会感觉上面十分的有道理,但是又有一些疑问。

在上面的计算过程中,始终只考虑了≤\sqrt n的质数,那么,那些>\sqrt n的质数呢?

其实,我们的g函数要计算的本来就只有质数的值,所以,我们的g函数算出来的结果并不是真正的结果。

还记得上面对于这类积性函数有什么要求吗?能够快速的计算F(x),x \epsilon Prime

所以,我们先假设所有的数的计算方法都等同于质数的计算方法,所以我们可以快速的计算前缀和

也就是g(n,0),虽然这个值是假的。但是,如果g中只包含了质数的值的话,那么它的计算结果就是真正的结果。

因此,预处理g的过程,我们理解为一个计算所有质数的值的过程。

质数+合数部分

引入S(n,j)=\sum_{i=1}^nF(i)[min(p)\ge P_j,p\in P,p|i\ ]

即求i满足最小质因数大于等于P_{j}F(i)之和

也有维护大于的,二者转移式有微小差别,这里维护大于等于的

这个和分为两部分,

一部分是大于等于P_{j}的质数,g(n,|P|)-\sum_{i=1}^{j-1}F(P_i)用所有质数的和减去小于P_{j}的那些质数的和

一部分是最小质因数大于等于P_{j}的合数,

考虑先枚举最小质因子P_{k}(k\geq j)

再枚举P_{k}的幂次e,表明P_{k}出现了几次,提一个F(P_{k}^{e})的贡献出来,

剩下的质因数,就需要大于等于P_{k+1}了,这部分是S(\frac{n}{P_{k}^{e}},k+1)

当然,对于这个合数,也可能就这一个质因数,

形如P_{k}^{e}[e\geq 2],所以枚举e\geq 1的时候,再加上F(P_{k}^{e+1})

写成公式的话,是

S(n,j)=g(n,|P|)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k\ge j}\sum_{e}(F(P_k^e)S(\frac{n}{P_k^e},k+1)+F(P_k^{e+1}))

终极目的

第二维正着推求出g,第二维倒着推求出S,答案=质数+合数+F(1),

结合S的定义,答案是S(n,0)+F(1)

细节

比如为了复杂度,实际用到的gS状态没那么多,

g是基于数论分块的,所以只有2*\sqrt n个第二维的状态,

所以要开id1和和id2数组用于离散化这些状态,

记Sqr=sqrt(n),不妨[l,r]这个区间段的n/l值相同,是第j个状态

若n/l<=Sqr,就用n/l记状态,id1[n/l]=j,

否则一定有r<=Sqr,就用r记状态,id2[r]=j,

还有必要写吗,这些不是都可以白嫖主义吗

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code92007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值