这一篇\(\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}\),那么:
\]
到这里我们可以推出一些奇奇怪怪的数论函数关系式:
\(\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\)如何用容斥的方法理解,不想写了可以看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!
那么可以推出:
&\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)\)了
\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)
简单写一下题面,求:
\]
化式子(这里如果有没看懂的,赶快回去复习一下):
&\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\)
然后就做完了。
接下来还有贝尔级数等一些鬼畜的高级玩意,直接给链接算了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:「总结」狄利克雷卷积,莫比乌斯反演和杜教筛 - Python技术站