数论
狄利克雷卷积
现在有数论函数 \(f,g\) 定义两者的狄利克雷卷积为:
\[(f*g)(n) = \sum_{d|n} f(d)g(\frac{n}{d})
\]
这东西有很多很好的性质:
- 交换律:\(f * g = g * f\)
- 结合律: \((f * g) * h = f * (g * h)\)
- 分配律:\((f + g) * h = f * h + g * h\)
一些常见的数论函数也可以通过狄利克雷卷积来算出:
我们定义:
\[\varepsilon (x) = [x = 1]
\]
\[I (x) = 1
\]
\[Id(x) = n
\]
则有:
\[\varepsilon = \mu * I
\]
\[\sigma_0 = I * I
\]
\[\sigma_1 = Id * I
\]
\[Id = I * \phi
\]
\[f = f * \varepsilon
\]
而莫比乌斯反演则是根据
\[\varepsilon = \mu * I
\]
来推导的。
莫比乌斯反演
现在有 \(f(n) = \sum_{d | n} g(d)\),则 \(g(d) = \sum_{d | n} \mu(\frac{n}{d}) f(d)\) 为什么呢?
证明:
\[g * I = f * \mu * I = f * \varepsilon = f
\]
而同样的:
\[f * \mu = g * I * \mu = g
\]
所以等式成立。
周期性的字符串
我们定义 \(f(x)\) 表示长度为 \(i\) 的字符串总量,\(g(x)\) 表示最小正周期为 \(x\) 的字符串的周期种类数,则:
\[f(n) = \sum_{d | n} g(d)
\]
莫反一波,有:
\[g(n) = \sum_{d | n} f(d) \mu(\frac{n}{d})
\]
答案就是 \(f(n) - g(n)\)。
「NOI2010」能量采集
神仙题,发现答案相当于求:
\[\sum_i^n \sum_j^m (\gcd(i, j) \times 2 - 1)
\]
重要的部分就是:
\[\sum_i^n \sum_j^m (\gcd(i, j))
\]
我们尝试化简,首先有 \(Id = I * \phi\),套进去就有:
\[\sum_i^n \sum_j^m \sum_{k|\gcd(i,j)} \phi(k)
\]
然后我们不妨设 \(n \le m\)
然后交换求和顺序:
\[\sum_{k}^n \phi(k) \sum_{ik}^n \sum_{jk}^m 1
\]
化简,然后就有
\[\sum_{k}^n \phi(k) \lfloor \frac{n}{k} \rfloor \lfloor \frac{m}{k} \rfloor
\]
然后就做完了,甚至可以做到 \(O(\sqrt n)\)。
YY的GCD
还是先写出答案:
\[\sum_i^n \sum_j^m \sum_{k\in prime} k [\gcd(i, j) = k]
\]
\[\sum_{k\in prime} k \sum_{ik}^n \sum_{jk}^m [\gcd(i, j) = 1]
\]
\[\sum_{k\in prime} k \sum_{ik}^n \sum_{jk}^m \sum_{d|i,d|j} \mu(d)
\]
\[\sum_{k\in prime} k \sum_{d} \mu(d) \lfloor \frac{n}{dk} \rfloor \lfloor \frac{m}{dk} \rfloor
\]
\[\sum_{D} \lfloor \frac{n}{D} \rfloor \lfloor \frac{m}{D} \rfloor \sum_{k \in prime} \mu(\frac{D}{k})
\]
发现后面那个东西是好预处理的,然后整除分块,然后就做完了。
约数个数和
我们考虑 \(d(ij)\) 等于什么。
我们考虑以下这个式子:
\[d(ij) = \sum_{x | i} \sum_{y | j} [\gcd(x, y) = 1]
\]
考虑以每个质数的视角来看,我们尝试构造一个双射,如果这个质数在 \(x\) 中出现,表示对应着次数等于 \(p\) 在 \(x\) 里的出现次数,如果在 \(y\) 里出现,表示对应着次数等于 \(p\) 在 \(i \times y\) 里的出现次数。
然后正常莫反就行了。
Crash的数字表格
直接写过程:
\[\sum_i^n\sum_j^m \text{lcm}(i, j)
\]
\[\sum_i^n\sum_j^m \frac{ij}{\gcd(i, j)}
\]
\[\sum_i^n\sum_j^m \sum_d^n \frac{ij}{d} [\gcd(i, j) = d]
\]
\[\sum_d^n \sum_i^{\lfloor \frac{n}{d} \rfloor} \sum_j^{\lfloor \frac{m}{d} \rfloor} ijd [\gcd(i, j) = 1]
\]
\[\sum_d^n d \sum_i^{\lfloor \frac{n}{d} \rfloor} \sum_j^{\lfloor \frac{m}{d} \rfloor} ij \sum_{k|i, k|j} \mu(k)
\]
\[\sum_d^n d \sum_{k}^n \mu(k) k^2 \sum_i^{\lfloor \frac{n}{dk} \rfloor} \sum_j^{\lfloor \frac{m}{dk} \rfloor} ij
\]
\[\sum_{D=dk}^n (\sum_i^{\lfloor \frac{n}{D} \rfloor} \sum_j^{\lfloor \frac{m}{D} \rfloor} ij) \sum d \mu(k) k^2
\]
发现后面那坨可以线性筛筛出来,然后就做完了。
「SDOI2014」数表
假如没有 \(a\) 的限制:
\[\sum_i^n \sum_j^m \sigma_1(\gcd(i,j))
\]
按照之前的套路莫反一下就有:
\[\sum_D^n \lfloor \frac{n}{D} \rfloor \lfloor \frac{m}{D} \rfloor \sum_{k|D} \sigma_1(k) \mu(\frac{D}{k})
\]
然后我们暴力求出全部的 \(\sigma_1\),并且将询问按照 \(a\) 排序,然后每次就多拓展每次新增的 \(a\),然后在暴力修改,然后用个数据结构维护单点加,区间求和就行了。
总复杂度:\(O(q \sqrt n \log n + n \log^2n)\) 难以想象,这居然能过。
杜教筛
假如说我们想快速求出数论函数的前缀和,可以尝试使用杜教筛。
假如我们要求 \(S(n) = \sum_i^n f(i)\),则我们可以先构造一个函数 \(g\),满足 \(g\) 和 \(f*g\) 的前缀和是好做的。
那我们就有:
\[\sum_i^n (f*g)(i) = \sum_i^n \sum_{d|i} f(d) g(\frac{i}{d})
\]
对后面那个式子化简,就有:
\[\sum_i^n (f*g)(i) = \sum_i^n \sum_j^{\lfloor \frac{n}{i} \rfloor} g(i) f(j)
\]
相当于:
\[\sum_i^n (f*g)(i) = \sum_i^n g(i) S(\frac{n}{i})
\]
假如我们现在想求 \(S(n)\),那么我们就可以:
\[g(1)S(n) = \sum_i^n(f * g)(i) - \sum_{i = 2}^n g(i) S(\frac{n}{i})
\]
对后面使用整除分块,然后就可以做到递归去实现。
即便 \(f\) 不是积性函数,但只要能构造出 \(g\),就可以使用杜教筛。
然后我们考虑计算复杂度。
我不会,反正能证明是 \(O(n^\frac{3}{4})\) 的,但是如果我们预处理出来 \(n^{\frac{2}{3}}\) 的 \(S(i)\),就可以做到 \(O(n^{\frac{2}{3}})\)。
function
我们先莫反预处理出来 \(f\) 前几项,然后直接杜教筛之。
Gcd and Lcm
我们考虑一个性质就是 \(f\) 是积性函数。
那么 \(f(\gcd(i, j)) f(\text{lcm}(i, j)) = f(i) f(j)\)。
那么原式子就等于:
\[(\sum_i^n f(i))^2
\]
相当于求解 \(\sum_i^n f(i)\)。
我们试着化简一波:
\[\sum_i^n\sum_{d|i} \mu(d)d
\]
\[\sum_i^n\sum_{d|i} \mu(\frac{n}{d})\frac{n}{d}
\]
\[\sum_d^n \sum_i^{\lfloor \frac{n}{d} \rfloor} \mu(i) i
\]
那我们只需要求出 \(g(x) = \mu(x) x\) 的前缀和就行了,而注意到 \(g * id = \varepsilon\),直接杜教筛。