Min_25筛学习笔记
Min_25筛
例题题面
\(f(x)\)是一个积性函数,且\(f(p^k)=p^k(p^k-1)\),求\(\sum_{i=1}^n f(i)\),其中\(n\leq 10^{10}\)。
题解
Min_25筛的基本思想:积性函数\(f(p^k)\)能表示成一个关于\(p^k\)的多项式,于是可以对每一项分别去处理。在此题中是一个二次的多项式。所以说,我们接下来的过程其实是在求这样一个式子:
其中的\(f\)和\(k\)均有别于上面的\(f\)和\(k\)
我们考虑将原式分成两部分:
其中前面那部分是质数,后面那部分是枚举合数。
我们先考虑第一部分怎么解决。
Part1
我们考虑一个dp:设\(g(n,j)\),满足:
其中显然的,\(i^k\)是一个完全积性函数。
在此题中,明显的,\(k\)为\(1\)或\(2\)。
接下来考虑转移,我们可以发现,如果从\(g(n,j-1)\)转移到\(g(n,j)\),我们就要删掉原本最小质因子是\(p_{j}\)的数,那么就有下面的转移:
其中前面那个就是最小质因子是\(p_j\)的所有数和质数,后面那个就是为了抵消掉质数。
不难发现,\(g(p_{j-1},j-1)\)即为前\(j-1\)个质数的\(k\)次方和,这个可以筛法搞一下,记为\(sp_{j-1}\)。
于是,我们就能求出\(1\)~\(n\)中所有质数的k次方和,即为\(g(n,x)\),其中\(x\)是满足\(p_x\leq \sqrt n\)的最大的\(x\)。为方便记为\(g(n)\)。
但是你会发现一个事儿,\(n\)太大,没办法把每一个\(g(n)\)都存下来。但是我们发现,我们需要的\(n\)都是由\(n\)除以某个数得到的,不难发现这样的值最多只有\(O(\sqrt n)\)种,于是就可以存下来了。
Part2
类似地考虑dp,设\(S(n,x)\)为\(1\)到\(n\)中所有最小质因子大于\(p_x\)的数的函数(即\(f\))值之和,那么答案就是\(S(n,0)+1\)。(1为\(f(1)\)的值)
将\(S\)分成两部分,一部分为质数,一部分为合数,则有:
前面那一半就是质数,后面的和式就是合数了。这个类似于上面\(g\)那条式子。后面那个\(e\neq1\)是因为\(e=1\)的时候在质数里算过了。
这个式子就可以递归去处理了。
经典trick
因为在处理\(g\)的时候,减去\(p_j^k(g(\frac{n}{p_j},j-1)-g(p_{j-1},j-1))\)意义即为将最小质因数为\(p_j\)的合数的函数值给去掉,所以这一部分的和就是全部合数的函数值的和。
例:【51NOD1847】奇怪的数学题