因为博主比较菜所以可能一些地方写的有问题或者不清楚,以及我的废话有点多…
在这里先感谢下小伙伴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)$