《Min25筛》
前言:It's hard, but keep going
花了n久的时间,终于可以算是理解了吧~
Min25筛:适用于求解积性函数f(i)的前缀和问题。
对于这个积性函数,需要满足$f(p^{k})$可以快速求出。
关于这个快速求出,就是可以理解为$f(p^{k})$是一个关于p的低阶多项式。
因为多项式可以拆分成多个单项式,所以就比较好求。
具体求解:
我们将函数分解质数和 和合数和,即为:
$\sum_{i = 1}^{n}f(i) = \sum_{}f(p)[p~is~a~prime] ~+~ \sum_{}^{} f(i)[i~is~not~a~prime~or~i = 1]$
这样就拆分为了质数和 和 合数和。
然后我们分开计算两部分即可。
对于第一部分的质数和,我们定义一个函数:
$g(n,j) = \sum_{i = 1}^{n}F(i)[i~is~a~prime~or~mini~>~p_{j}^{}]$
F(i)是我们找的一个完全积性函数,满足他在质数处的取值和f(i)一样。
mini表示i的最小质因子,$p_{j}^{}$表示第j个质数。
上面这个式子就是统计了质数的F(i)的和 + 最小质因子大于$p_{j}^{}$的F(i)的和。
考虑从g(n,j-1)到g(n,j)的转移。
$g(n,j) = \bigl(\begin{smallmatrix}
g(n,j-1) & & p_{j}^{}~>~\sqrt{n}\\
g(n,j-1) - F(p_{j}^{})(~g(\frac{n}{p_{j}^{}},j-1) - g(p_{j-1}^{},j-1)) & & p_{j}^{}~<=~\sqrt{n}
\end{smallmatrix}\bigr)$
解释:这个转移,首先如果满足$p_{j}^{}~>~\sqrt{n}$,那么pj不会产生作为某个数的最小因子产生新的贡献。
然后对于求质数和的情况,大家都是1~n,所以第一个条件可以直接转移。
对于第二个,pj会作为某个数的最小质因子产生新的贡献,所以要减去这个贡献,那么为什么减去而不是加上这个贡献?
因为我们的g函数是求mini > pj,到pj之后,显然之前满足mini <= pj的就不满足了,所以是减去这个贡献。
对于这个贡献的计算,考虑容斥,对于这个质因子的贡献的函数,显然是g(n,j-1)里满足条件的值,然后因为这是积性函数,所以我们把f(pj)提出来。
可以发现这中间多计算了<pj的质数的代价,所以后面要减去这个代价。
可以发现,这里在$p_{j}^{} > \sqrt{n}$后,后面的质数肯定都满足这个条件,且这个值都是一样的,因为都是第一种转移了。
所以,我们只需要处理$\sqrt{n}$的质数即可,即我们可以线性筛出前$\sqrt{n}$个质数,并做$\sqrt{n}$此g函数的转移。
复杂度是O($\sqrt{n}$)
可以注意到这里的$g(p_{j-1}^{},j-1)$其实就是前j-1个质数的F(i)函数和,所以我们可以在线性筛时同时处理出来。