「总结」狄利克雷卷积,莫比乌斯反演和杜教筛

这一篇\(\texttt{blog}\)应该算这篇的后续,所以可以先看一下这一篇QwQ

0. 一些奇奇怪怪的数论函数

\(\begin{aligned}1. \; & \textbf{1}(x) = 1 \\2. \; & \textbf{id}(x) = x, \textbf{id}^k(x) = x ^ k \\3. \; & \textbf{d}(x) = \sum_{d \mid x} 1 \\4. \; & \sigma(x) = \sum_{d\mid x} d\\ 5. \; & \epsilon(x) = [x = 1]\end{aligned}\)

1. 狄利克雷卷积

\(\textbf{h} = \textbf{f} * \textbf{g}\),那么:

\[\textbf{h}(x) = \sum_{d\mid x} \textbf{f}(d)\textbf{g}(\frac nd) \]

到这里我们可以推出一些奇奇怪怪的数论函数关系式:

\(\begin{aligned}1.\;& \textbf{d} = \textbf 1 * \textbf 1\\ 2.\; & \sigma = \textbf 1 * \textbf{id} \\ 3. \; & \textbf{id} = \textbf 1 * \varphi \\ 4. \; & \sigma = \textbf 1 * \textbf 1 * \varphi = \textbf d * \varphi \end{aligned}\)

其中第四个是乱搞的(逃

2. 莫比乌斯反演

\(\mu * \textbf 1 = \epsilon\),那么设\(\textbf f = \textbf 1 * \textbf g\),则\(\textbf g = \mu * \textbf f\)

然后没了

到这里我们又可以推出一些奇奇怪怪的数论函数关系式:

\(\begin{aligned} 1. \; & \varphi = \textbf{id} * \mu \\ 2. \; & \textbf 1 = \mu * \textbf d \\ 3. \; & \textbf{id} = \sigma * \mu \end{aligned}\)

后面两个都是乱搞的(逃

说不定后面两个在杜教筛\(\textbf d\)\(\sigma\)的时候有用(雾

前人研究了一下\(\mu\),发现这不仅牵涉到数论函数的关系,还发现它是一种特殊的容斥系数。这个特性等下再讲,先看一看\(\mu\)的其它的性质。

我们研究一下\(\mu\)\(p^k\)处的取值(\(p\)是质数)

\[\mu(n) = \begin{cases} 1 & k = 0 \\ -1 & k = 1 \\ 0 & k > 1 \end{cases} \]

于是就可以非常好的线性筛了。

至于\(\mu\)如何用容斥的方法理解,不想写了可以看yyb的博客

做题?题目一般会给出求\(\sum_{i=1}^n\sum_{j=1}^m \textbf f(\gcd(i, j))\)

然后套路就是可以变成\(\sum_{i=1}^n \sum_{j=1}^m \sum_{d | i, d | j} \textbf g(d), \textbf g = \textbf f * \mu\)

接下来提出\(d\)就可以乱搞了。

给道例题,就写一道之前那篇文章写的有一点不完全的题目吧。

给定\(n, m, (n \leq m)\)\(\sum_{i=1}^n\sum_{j=1}^m \sigma(\gcd(i, j))\)

\(\because \textbf f = \sigma,\therefore \textbf g = \mu * \sigma\)

之前的g就止步于此

通过这篇文章的推导,我们翻上面的式子发现\(\mu * \sigma = \textbf{id}\),于是\(\textbf g = \textbf{id}\)

Wow!

那么可以推出:

\[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^m \sigma(\gcd(i,j)) \\ =& \sum_{i=1}^n\sum_{j=1}^m\sum_{d|i, d|j} d \\ =& \sum_{d=1}^nd\sum_{d|i}^n\sum_{d|j}^m 1 \\ =& \sum_{d=1}^n d\left\lfloor\frac nd\right\rfloor\left\lfloor\frac md\right\rfloor \end{aligned} \]

写个鬼的线性筛,直接算不就可以了QwQ

3. 杜教筛

用来求积性函数前缀和。即求\(\textbf S(n) = \sum_{i=1}^n \textbf f(i)\)

假设我们找到了一个有趣的函数\(\textbf g\),使得\(\textbf g\)\(\textbf f * \textbf g\)的前缀和都可以快速求,那么我们可以快速求解\(\textbf S(n)\)

\[\begin{aligned} \because \sum_{i=1}^n (\textbf f * \textbf g)(i) &= \sum_{i=1}^n\sum_{d\mid i} \textbf f\left(\left\lfloor\frac id\right\rfloor\right) \textbf g(d) \\ &= \sum_{d=1}^n \textbf g(d) \sum_{i=1}^{n/d} \textbf f(i) \\ &= \sum_{i=1}^n \textbf g(i) \textbf S\left(\left\lfloor\frac ni\right\rfloor\right) \end{aligned} \]

那么\(\textbf g(1)\textbf S(n) = \sum_{i=1}^n (\textbf f * \textbf g)(i) - \sum_{i=2}^n \textbf g(i) \textbf S\left(\left\lfloor\frac ni\right\rfloor\right)\)

前一半可以快速求,后一半可以数论分块\(+\)递归求。

复杂度?\(\mathrm{O}(n ^ {\frac 23})\)或者\(\mathrm{O}(n ^ \frac 34)\),这取决于你的实现方式。

然后对于\(\sum_{i=1}^n (\textbf f * \textbf g)(i)\)要多快速求呢?首先如果可以\(\mathrm{O}(1)\)算是坠好的,然后我们发现后面要\(\mathrm{O}(\sqrt n)\)的计算,所以这个柿子在\(\mathrm{O}(\sqrt n)\)的时间复杂度内解决也是没有问题的。

同时这个玩意每次算的值都是一个\(\left\lfloor\frac nx\right\rfloor\),所以求\(\sum_{i=1}^n (\textbf f * \textbf g)(i)\)可以套一个杜教筛。

同理\(\sum_{i=1}^n \textbf g(i)\)也可以套一层杜教筛,复杂度不会改变。

杜教筛的套路和莫比乌斯反演很像,都需要对狄利克雷卷积有深刻的理解和熟练的背诵

莫比乌斯反演需要找到一个函数\(\textbf g = \textbf f * \mu\),杜教筛则是需要找到一个函数\(\textbf g\)使得\(\sum \textbf g(i)\)\(\sum (\textbf f * \textbf g)(i)\)可以快速计算。

所以上面的那些奇奇怪怪的数论函数关系式要记住。

举个例子吧,求\(\sum_{i=1}^n \varphi(i)\)

找到一个函数\(\textbf g\)使得\(\varphi * \textbf g\)可以快速算。

这个时候我们翻一下上面的式子可以发现\(\varphi * \textbf 1 = \textbf{id}\),然后\(\sum \textbf{id}(i)\)可以快速求,于是就做完了。

蛤?你说这个例子太简单?那就用一道题目来仔细讲一下这个套路吧。

洛谷P4213 【模板】杜教筛(Sum)

洛谷P3768 简单的数学题

简单写一下题面,求:

\[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j), n \leq 10^{10} \]

化式子(这里如果有没看懂的,赶快回去复习一下):

\[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^n ij\gcd(i,j) \\ =& \sum_{i=1}^n\sum_{j=1}^nij\sum_{d|i, d|j} \varphi(d) \\ =& \sum_{d=1}^n\varphi(d)\sum_{d|i}i\sum_{d|j}j \\ =& \sum_{d=1}^n d^2 \varphi(d) S\left(\left\lfloor\frac nd\right\rfloor\right)^2 \end{aligned} \]

其中\(S(x) = \sum_{i=1}^x i\)

然后根据之前的套路,我们数论分块,问题转化为如何快速求\(d^2\varphi(d)\)的前缀和。

首先通过之前杜教筛可以再套杜教筛的理论,这里即使有一个数论分块,复杂度还是\(\mathrm{O}(n^\frac 23)\),于是复杂度是对的,可以放心筛。

接下来考虑对于\(\textbf f(x) = x^2\varphi(x)\),怎么找到一个合适的函数\(\textbf g\)使得\(\textbf f * \textbf g\)好算。

定义点积\((\textbf f\cdot\textbf g)(i) = \textbf f(i) \textbf g(i)\),那么我们可以得到一个定理:

\(\textbf f\)为完全积性函数,\(\textbf g, \textbf h\)是数论函数,那么\((\textbf f \cdot \textbf g) * (\textbf f \cdot \textbf h) = \textbf f \cdot(\textbf g * \textbf h)\)

证明的话显然。这个定理不就是给我们做题用的吗(逃

于是对于\(\textbf f = \textbf{id}^2 \cdot \varphi\),可以找到\(\textbf g = \textbf{id}^2 \cdot \textbf 1\),那么\(\textbf f * \textbf g = \textbf{id}^3, \textbf g = \textbf{id}^2\)

然后就做完了。

接下来还有贝尔级数等一些鬼畜的高级玩意,直接给链接算了。

posted @ 2019-03-24 10:48  xgzc  阅读(352)  评论(6编辑  收藏  举报