[日常摸鱼]杜教筛

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[日常摸鱼]杜教筛相关的知识,希望对你有一定的参考价值。

因为博主比较菜所以可能一些地方写的有问题或者不清楚,以及我的废话有点多…

在这里先感谢下小伙伴ww @MoebiusMeow 的帮助~

 

参考资料:

[1]浅谈一类积性函数的前缀和(skywalkert)

[2]杜教筛——省选前的学习1(_rqy)

 


 

(下面约定$[p]$表示满足条件$p$时为1不满足为0,以及下面说的函数都是数论函数)

前置技能(一些定义)

数论函数:若$f:Z^{+} \\rightarrow C$,则称$f$为数论函数

积性函数:若一个数论函数$f(n)$对于所有$m_1 \\bot m_2$有$f(m_1*m_2)=f(m_1)*f(m_2)$且$f(1)=1$那么称$f(n)$是积性函数,如果对于任意$m_1,m_2$都满足上面那个条件那么就称$f(n)$是完全积性函数,常见的比如莫比乌斯函数、欧拉函数、表示约数个数的函数、幂函数($id_k(n)=n^{k}$)([1])

如果$f$是一个积性函数,把$n$分解成$p_1^{q_1}*p_2^{q_2}*...*p_k^{q_k}$,那么可以得到$f(n)=\\prod_{i=1}^k f(p_i^{q_i})$

狄利克雷卷积:对两个函数$f,g$记他们的狄利克雷卷积为:$$ (f*g)(n)=\\sum_{d|n}f(d)*g(\\frac{n}{d}) $$,很明显$(f*g)=(g*f)$

狄利克雷卷积的单位元函数为$e(n)=[n=1]$,如果$f,g$都是积性函数那么$f*g$也是积性函数,函数集和狄利克雷卷积能够构成群

 

杜教筛

问题:快速计算一个$f$的前缀和:$S(n)=\\sum_{i=1}^n f(i)$(比如欧拉函数,$n$可以到1e10的级别)

假设找到了一个合适的函数$g$,他们卷积的前缀和(QwQ我这里写的会比较繁琐很多…):

$$ \\begin{aligned} \\sum_{i=1}^n(f*g)(n) & = \\sum_{i=1}^n \\sum_{d \\mid i} g(d)f( \\frac{i}{d}) \\\\ & = \\sum_{i=1}^n \\sum_{d=1}^n [d|i] g(d) f(\\frac{i}{d}) \\\\ & = \\sum_{d=1}^n g(d) \\sum_{i=1}^n [d|i] f(i) \\\\ & = \\sum_{d=1}^n g(d) \\sum_{i=1}^n \\sum_{t=1}^n [i=dt] f(i) \\\\ & = \\sum_{d=1}^n g(d) \\sum_{t=1}^n \\sum_{i=1}^n [i=dt] f(i) \\\\ & = \\sum_{d=1}^n g(d) \\sum_{t=1}^{\\lfloor\\frac{n}{d} \\rfloor } \\sum_{i=1}^n [i=dt]f(i) \\\\ & = \\sum_{d=1}^n g(d) \\sum_{t=1}^{\\lfloor \\frac{n}{d} \\rfloor } f(i) \\\\ & = \\sum_{d=1}^n g(d)S(\\lfloor \\frac{n}{d} \\rfloor)\\end{aligned}$$

(最后三行是因为当$t>\\lfloor \\frac{n}{d} \\rfloor$时后面的和式为0,所以这时候可以直接把上界缩小,以及对于每一对$d,t$页只有一个$i$与之对应,这时候后面的和式为1)

然后把$d=1$的提出来就得到了:

$$g(1)S(n)=\\sum_{i=1}^n (f*g)(i)-\\sum_{i=2}^n g(n)S(\\lfloor \\frac{n}{i} \\rfloor)$$

这里的$\\lfloor \\frac{n}{i} \\rfloor$一共只有$O(\\sqrt{n})$种取值,如果能够快速处理掉$g(1)$以及算出卷积的前缀和那么根据[1]里面说的就可以在$O(n^{\\frac{3}{4}})$的时间里算出$S(n)$,如果$f$是一个积性函数,那么利用积性筛出前$n^{\\frac{2}{3}}$项从而让复杂度降到$O(n^{\\frac{2}{3}})$

 

比如算莫比乌斯函数的前缀和(51nod1244),令$g(n)=1$,根据$\\mu$的定义他们的卷积直接就是$[n==1]$,代进去直接得到$S(n)=1-\\sum_{i=2}^nS(\\lfloor \\frac{n}{i} \\rfloor)$,用上面说的做法就能过了

 

再比如欧拉函数的前缀和(51nod1239),注意到$\\sum_{d|n} \\phi(d)=n$,这就相当于$\\phi * 1=n$,同样直接代进去就可以得到$S(n)=\\frac{n(n+1)}{2}-\\sum_{i=2}^n S(\\lfloor \\frac{n}{i} \\rfloor)$

 

以上是关于[日常摸鱼]杜教筛的主要内容,如果未能解决你的问题,请参考以下文章

杜教筛题表(已完成)

杜教筛学习笔记

hdu5608杜教筛

杜教筛

杜教筛

浅谈杜教筛