本文前置芝士:
- 对莫比乌斯函数以及莫比乌斯反演有着基本的了解
- 会一些数论,能看懂Latex
- 较强的语文能力
- 没了
本文主要介绍了三种在莫反题目中有着较广泛应用的求解方法,结合例题说明。
应注意,若某一变量的取值无一确定上界,或是可在后续式子中判定其值的界,其取值上界将不被标明。
1. 化式子
来看jzptab的式子:
$$ \large\sum_{i = 1}^n \sum_{j = 1} ^ {m} \ lcm(i, j) $$
显然地,我们有
$$ \large\sum_{i = 1}^n \sum_{j = 1} ^ {m} \ \frac{i \times j}{\gcd(i,j)} $$
首先,我们需要进行 $\gcd$ 的代换,以使形如 $[\gcd(i,j) = m]$ 的贡献计算式产生。
因此,我们有
$$ \large\sum_{k = 1} \sum_{i = 1}^n \sum_{j = 1} ^ {m} \ \frac{i \times j}{k}\ [\gcd(i,j) =k] $$
接下来进行一系列变形。
\[\large\begin{aligned}
& \large\sum_{k = 1} \sum_{i = 1}^n \sum_{j = 1} ^ {m} \ \frac{i \times j}{k}\ [\gcd(i,j) =k]
\\=\ & \sum_{k = 1} \frac 1 k \sum_{i = 1}^n \sum_{j = 1} ^ {m} \ i \times j\ [\gcd(i,j) =k]
\\=\ & \sum_{k = 1} \frac 1 k \sum_{i = 1}^n \sum_{j = 1} ^ {m} \ i \times j\ [\gcd(i/k,j/k) = 1]
\\=\ & \sum_{k = 1} \frac 1 k \sum_{i = 1}^{\lfloor \frac n k \rfloor} \sum_{j = 1} ^ {\lfloor \frac m k \rfloor} \ ik \times jk\ [\gcd(i,j) = 1]
\\=\ & \sum_{k = 1} k \sum_{i = 1}^{\lfloor \frac n k \rfloor} \sum_{j = 1} ^ {\lfloor \frac m k \rfloor} \ i \times j\ [\gcd(i,j) = 1]
\end{aligned} \]
在第三行中,我们使用 $ \frac i k $ 作为新的 \(i\),这使得我们得以将枚举范围缩小、将 \(\frac 1 k\) 化为 \(k\),并将形如 \([\gcd(i,j) = m]\) 的计算式化为形如 \([\gcd(i,j) = 1]\) 的式。第三个作用是本求解方法的精髓所在。
我们已经了解了下式:
\[[n = 1] = \sum_{e|n} \mu(e)
\]
因此可以如此地将原式变形:
\[\large\begin{aligned}
&\sum_{k = 1} k \sum_{i = 1}^{\lfloor \frac n k \rfloor} \sum_{j = 1} ^ {\lfloor \frac m k \rfloor} \ i \times j\ [\gcd(i,j) = 1]
\\=\ & \sum_{k = 1} k \sum_{i = 1}^{\lfloor \frac n k \rfloor} \sum_{j = 1} ^ {\lfloor \frac m k \rfloor} \ i \times j\ \sum_{e|gcd(i,j)} \mu(e)
\\=\ & \sum_{k = 1} k \sum_{i = 1}^{\lfloor \frac n k \rfloor} \sum_{j = 1} ^ {\lfloor \frac m k \rfloor} \ i \times j\ \sum_{e|i,\ e|j} \mu(e)
\\=\ & \sum_{k = 1} k\sum_{e = 1} \sum_{e|i}^{\lfloor \frac n k \rfloor} \sum_{e|j} ^ {\lfloor \frac m k \rfloor} \ i \times j\ \mu(e)
\\=\ & \sum_{k = 1} k\sum_{e = 1} \sum_{i = 1}^{\lfloor \frac n {k\,e} \rfloor} \sum_{j = 1} ^ {\lfloor \frac m {k\,e} \rfloor} \ ie \times je\ \mu(e)
\\=\ & \sum_{k = 1} k\sum_{e = 1} \mu(e) \ e^2 \sum_{i = 1}^{\lfloor \frac n {k\,e} \rfloor} \sum_{j = 1} ^ {\lfloor \frac {m} {k\,e} \rfloor} \ i \times j\
\\=\ & \sum_{k = 1} k\sum_{e = 1} \mu(e) \ e^2 (\ \sum_{i = 1} ^ {\lfloor \frac {n} {k\,e} \rfloor} i \ ) (\ \sum_{j = 1} ^ {\lfloor \frac {m} {k\,e} \rfloor} j \ )
\end{aligned} \]
设 \(s(n) = \sum\limits_{i = 1} ^ {n} i = \frac{ n\times (n+1) } 2\)
原式即为 $$\large\sum_{k = 1} k\sum_{e = 1} \mu(e) \ e^2 \ s(\lfloor \frac {n} {ke} \rfloor) \ s(\lfloor \frac {m} {ke} \rfloor) $$
为好求,我们将 \(\mu\) 函数提前
\[\large\sum_{e = 1} \mu(e) \ e^2\sum_{k = 1} k \ s(\lfloor \frac {n} {ke} \rfloor) \ s(\lfloor \frac {m} {ke} \rfloor)
\]
此时,我们可使用数论分块分别计算两个 \(\sum\) ,在洛谷上可以得到100分的好成绩。然而,这并非极限——因为在bzoj上只能得到70分。因此,我们需要进一步优化。
例题:约数个数和
2. 代换消根号
此方法是方法1的后继,并只在两次数论分块时才可用,这是由于其使用了将两次枚举 \(k\) 与 \(e\) 变为了枚举 \(T = ke\) 与 \(e\),并使用 \(\frac T e\) 来代换 \(k\)。我们将在接下来的介绍中看到此方法的优化思路。
继续讨论jzptab。我们可以通过如上的叙述将式子进行此类代换:
\[\large\begin{aligned}
&\sum_{e = 1} \mu(e) \ e^2\sum_{k = 1} k \ s(\lfloor \frac {n} {ke} \rfloor) \ s(\lfloor \frac {m} {ke} \rfloor)
\\=\ & \sum_{e = 1} \mu(e) \ e\sum_{k = 1} ke \ s(\lfloor \frac {n} {ke} \rfloor) \ s(\lfloor \frac {m} {ke} \rfloor)
\\=\ & \sum_{T = 1}\sum_{e|T}T \ \mu(e) e \ s(\lfloor \frac {n} T \rfloor) \ s(\lfloor \frac {m} T \rfloor)
\\=\ & \sum_{T = 1}T \ s(\lfloor \frac {n} T \rfloor) \ s(\lfloor \frac {m} T \rfloor) \sum_{e|T} \mu(e) e
\end{aligned} \]
我们可以看到,后部 \(\sum\limits_{e|T} \mu(e) e\) 的部分可以通过线性筛与倍数贡献求出来,这样就可以做到单次数论分块求解了。
讨论于神之怒加强版。
\[\large\begin{aligned}
&\sum_{i = 1}^n \sum_{j = 1} ^ m \gcd(i,j) ^ c
\\=\ & \sum_{k=1} k ^ c \sum_{i = 1}^n \sum_{j = 1} ^ m \ [\gcd(i,j) = k]
\\=\ & \sum_{k=1} k ^ c \sum_{i = 1}^ {\lfloor \frac {n} {k} \rfloor} \sum_{j = 1} ^ {\lfloor \frac {m} {k} \rfloor} \ [\gcd(i,j) = 1]
\\=\ & \sum_{k=1} k ^ c \sum_{i = 1}^ {\lfloor \frac {n} {k} \rfloor} \sum_{j = 1} ^ {\lfloor \frac {m} {k} \rfloor} \ \sum_{e|i, e|j}\mu(e)
\\=\ & \sum_{k=1} k^c \sum_{e|i, e|j}\mu(e) \lfloor \frac {n} {ke} \rfloor \lfloor \frac {m} {ke} \rfloor
\\=\ & \sum_{T=1} \lfloor \frac {n} {T} \rfloor \lfloor \frac {m} {T} \rfloor \sum_{e|T} \mu(e) (\frac T e) ^ c
\end{aligned} \]
可以看出来,后部分是 \(mu\) 函数和幂函数的卷积,而幂函数是积性的。因此,我们可以通过线性筛求得 $f(x) = \sum\limits_{e|T} \mu(e) (\frac T e) ^ c $ 的值,以此优化求解。
总的来说,此方法的核心是通过配凑与代换,联系起两个且需要分别数论分块求解的部分,构造出一个新的(不一定)积性的函数,并使用枚举因子或直接筛的方法进行求值。
例题:YY的GCD and DZY loves math I
3. 连加换连乘
这题真有黑的难度?
首先,显然题目让我们求的式子是:
\[\large\prod_{i=1}^n\prod_{j=1}^m f(\gcd(i,j))
\]
为了化这个式子,我们需要先知道我们一直在用的 \(k\) 变量枚举的是什么。首先,我们用 \(k\) 代换掉了 \(\gcd(i,j)\),这样后面的部分就表示 \(k\) 的贡献度,其代表了 \(k\) 对答案贡献的次数,并由于 \(k\) 对答案贡献的方式是加,因此贡献次数就代表着其系数。现在我们只需要把贡献方式改成乘即可。
这是很简单的,甚至于不用变贡献度的枚举方法,只需要把它放在幂的位置上即可。
式子的化法,中间过程不再详细展开:
\[\large\begin{aligned}
&\prod_{i=1}^n\prod_{j=1}^m f(\gcd(i,j))
\\=\ & \prod_{k=1} f(k) ^{\sum_{i=1}^n\sum_{j=1}^m \ [gcd(i,j)=k]}
\\=\ & \prod_{k=1} f(k) ^{\sum\limits_{e=1} \mu(e) \lfloor \frac n {k\,e} \rfloor\lfloor \frac m {k\,e} \rfloor}
\end{aligned} \]
我们可以看到,在结果中又出现了 \(ke\) 的形式。那我们可以使用方法2优化求解吗?显然是可以的。我们通过相似的方式,用 \(T\) 替换 \(ke\),并把连加换成连乘。具体看如下化法:
\[\large\begin{aligned}
&\prod_{k=1} f(k) ^{\sum\limits_{e=1} \mu(e) \lfloor \frac n {k\,e} \rfloor\lfloor \frac m {k\,e} \rfloor}
\\=\ & \prod_{T=1} \prod_{d|T} f(d) ^ {\mu(\frac T d)\lfloor \frac n T \rfloor\lfloor \frac m T \rfloor}
\\=\ & \prod_{T=1} (\ \prod_{d|T} f(d) ^ {\mu(\frac T d) }\ ) ^ {\lfloor \frac n T \rfloor\lfloor \frac m T \rfloor}
\end{aligned} \]
于是,我们只需要通过预处理括号内的连乘,即可单次根号求解。值得注意的是,此类函数难以通过筛法求得,因此可以通过枚举因子的方式 \(O(n \ln n)\) 地求得。
upd:此 trick 的更常用表述是 \(\ln\to\exp\)。
例题:Product and 幽灵乐团