数学总结 2(数论函数、狄利克雷卷积、反演相关)

零、前言 & 目录

本文结构较为混乱,因为实在找不到一种类似于拓扑的高效学习方式。
不是莫反这玩意儿为什么不是 DAG 啊 /fn
说实话,莫反板块的 Easy Version 和 Hard Version 几乎是同一个东西。

  1. 整除分块
  2. 积性函数
  3. 筛法
  4. 莫比乌斯反演(Easy Version)
  5. 狄利克雷卷积(Dirichlet)
  6. 莫比乌斯反演(Hard Version)
  7. 欧拉反演

一、整除分块

\(\{\lfloor \frac{n}{1} \rfloor, \lfloor \frac{n}{2} \rfloor, \dots, \lfloor \frac{n}{n} \rfloor, \dots\}\) 的元素种类一定是 \(O(\sqrt{n})\) 级别的。
证:

  • 对于 \(i \leq \sqrt{n}\),最多只有 \(\sqrt{n}\) 种。
  • 对于 \(i \gt \sqrt{n}\),都有 \(\lfloor \frac{n}{i} \rfloor \leq \sqrt{n}\),因此也只有 \(\sqrt{n}\) 种。
  • 对于 \(i \gt n\),都有 \(\lfloor \frac{n}{i} \rfloor = 0\),只有一种。

可以利用这个性质做一些美妙的优化。
假设我们已经知道 \(t = \lfloor \frac{n}{l} \rfloor\),想要求出极大的 \(r\) 使得 \(\lfloor \frac{n}{r} \rfloor = t\)
事实上 \(r = \lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor\)

整除分块例 1:洛谷 P2261 CQOI2007 余数求和。略微转化一下就是整除分块板子了。
整除分块例 2:P2260 清华集训 2012 模积和\(\color{red}{Sol}\).


二、积性函数

先定义数论函数表示定义域为正整数的函数。

\(\gcd(a,b) = 1\) 时,若有 \(f(ab) = f(a) \times f(b)\),则 \(f\)积性函数
若没有 \(\gcd\) 的限制,即对于任意正整数 \(a,b\) 都有 \(f(ab) = f(a) \times f(b)\),则称 \(f\)完全积性函数

常见的积性函数

常数函数 \(I\)

定义 \(I(n) = 1\),这显然是完全积性函数。

单位函数 \(\epsilon\)

定义 \(\epsilon(n) = [n = 1]\),这显然是完全积性函数。

因子个数 \(d\)

对于质数幂,有 \(d(p^\alpha) = \alpha + 1\)
对于任意 \(m = \prod\limits_{i=1}^{k} p_i^{\alpha_i}\),有 \(d(m) = \prod\limits_{i=1}^{k} d(p_i^{\alpha_i}) = \prod\limits_{i=1}^{k} (\alpha_i + 1)\)
由此因子个数显然是积性函数。

因子之和 \(\sigma\)

对于质数幂,有 \(\sigma(p^\alpha) = 1 + p + p^2 + \dots + p^\alpha = \frac{p^{\alpha + 1} - 1}{p - 1}\)
这东西分配律一下也是积性函数。

莫比乌斯函数 \(\mu\)

(莫比乌斯函数的定义在后面)
对于质数幂,\(\mu(p^\alpha)\)

  • \(\alpha = 0\)\(\mu = 1\)
  • \(\alpha = 1\)\(\mu = -1\)
  • \(\alpha \gt 1\)\(\mu = 0\)

对于任意 \(m = \prod\limits_{i=1}^{k} p_i^{\alpha_i}\)

  • 只要有一个质数幂因子包含平方,那么整个 \(m\)\(\mu\) 就是 \(0\)
  • 否则有几种质因子它就是 \(-1\) 的几次方,因为质因子之间互相独立。

通过定义得到 \(\mu\) 是积性函数。

欧拉函数 \(\varphi\)

对于质数幂,有 \(\varphi(p^\alpha) = p^\alpha - \frac{p-1}{p}\)
类比因子个数,这也是积性函数。


三、筛法

首先这些函数可以通过定义直接计算。
然后对于上述有特殊性质的积性函数,如何优化?

埃氏筛法

由于积性函数的性质类似于因子和倍数之间的关系,所以可以类比筛质数,直接暴力枚举倍数更新对应的函数值。
复杂度是 \(O(n \log \log n)\),有很多优化空间,详见 OI-Wiki

线性筛法

类比线性筛质数,每个数只会被最小质因子筛掉,所以复杂度是线性的。

for (int i = 2; i <= n; i++) {
    if (!st[i]) pr[++tot] = i;
    for (int j = 1; j <= tot && i * pr[j] <= n; i++) {
        st[i * pr[j]] = 1;
        if (i % pr[j] == 0) break;
    }
}

对于积性函数,可以直接在筛法过程中计算函数值。
即在 \(i\) 的基础上添加最小质因子 \(pr_j\) 的贡献,通过 \(i\) 的函数值和加入 \(pr_j\) 后的变化量计算 \(i \times pr_j\) 的函数值。
注意对于积性函数 \(f\),有 \(f(1) = f(1) \times f(1), f(i) = f(1) \times f(i)\),因此一定有 \(f(1) = 1\),代码实现要注意。

线性筛莫比乌斯函数 \(\mu\)

mu[1] = 1;
for (int i = 2; i <= n; i++) {
    if (!st[i]) pr[++tot] = i, mu[i] = -1;
    for (int j = 1; j <= tot && i * pr[j] <= n; i++) {
        st[i * pr[j]] = 1;
        if (i % pr[j] == 0) { mu[i * pr[j]] = 0; break; }
        mu[i * pr[j]] = -mu[i];
    }
}

线性筛欧拉函数 \(\varphi\)

phi[1] = 1;
for (int i = 2; i <= n; i++) {
    if (!st[i]) pr[++tot] = i, phi[i] = i - 1;
    for (int j = 1; j <= tot && i * pr[j] <= n; i++) {
        st[i * pr[j]] = 1;
        if (i % pr[j] == 0) { phi[i * pr[j]] = phi[i] * pr[j]; break; }
        phi[i * pr[j]] = phi[i] * (pr[j] - 1);
    }
}

四、莫比乌斯反演(Easy Version)

$$\Large\rightarrow \color{red}{远古莫反题解合集}\leftarrow$$

好的你被骗了上面那个题解合集里面并不全是莫反。
远古题解合集写的确实很丑,好像还有一堆公式错误,懒得改了弃坑。

莫比乌斯函数 & 引入

定义莫比乌斯函数 \(\mu(i)\)

  • \(i\) 存在平方因子,则 \(\mu(i) = 0\)
  • 否则设 \(i\) 质因数分解为 \(p_1 p_2 \dots p_k\),则 \(\mu(i) = (-1)^k\)

假设现在要解决这样的问题:\(i,j \in [1,n]\),求 \(\gcd(i,j) = 1\) 的二元组 \((i,j)\) 数量。

一种做法是钦定 \(i \gt j\),则 \(\gcd(i,j)=1\) 相当于 \(i\) 以内和 \(i\) 互质的数的数量,即 \(\varphi(i)\)

考虑另一种思想:用容斥解决该问题。
考虑用总数减去 \(\gcd\) 不为 \(1\) 的。给 \(\gcd\) 也做一个类似于质因数分解的事情,即只在质因数层面统计它。
总数为 \(n^2\),然后减掉同时有因子 \(2\) 的对数、同时有因子 \(3\) 的对数、同时有因子 \(5\) 的对数、……,加上同时有因子 \(2,3\) 的对数、加上同时有因子 \(2,5\) 的对数、加上同时有因子 \(3,5\) 的对数、……减去同时有因子 \(2,3,5\) 的对数……

考虑暴力做法是枚举 \((i,j)\),查它的 \(\gcd\) 是否为 \(1\),现在反向思考:枚举公因数去看有多少对 \((i,j)\) 满足条件,再容斥。
不难发现假设这个公因数有 \(k\) 个质因子,则容斥系数就是 \((-1)^k\)
如果它存在平方质因子,那么容斥系数就是 \(0\)
这和莫比乌斯函数是等价的。

那么之前问题的答案就是:\(\sum\limits_{i=1}^{n} \sum\limits_{i ~|~ x}^{x \leq n} \sum\limits_{i ~|~ y}^{y \leq n} \mu(i)\),也就是直接求有多少个倍数。
即:\(\sum\limits_{i=1}^{n} \lfloor \frac{n}{i} \rfloor ^2 \times \mu(i)\)

事实上 Easy Version 就是容斥。

例 1:洛谷 P2158 SDOI2008 仪仗队

\(N \times N\) 个人,排列成正方形。
现在求站在左下角,能看到多少人。

和之前的问题是一样的,如果把自己的位置看作 \((0,0)\),那么最后再加上 \((0,1), (1,0)\) 两个位置即可。

例 2:洛谷 P3455 POI 2007 ZAP-Queries

给出 \(a,b,d\),求满足 \(1 \leq x \leq a\)\(1 \leq y \leq b\),且 \(\gcd(x,y)=d\) 的二元组 \((x,y)\) 的数量。

类似于上面那题,\(\gcd(x,y) = d\) 先化为 \(\gcd(x,y) = 1\),即上界都 \(\div d\) 之后再计算。
转化之后大致是类似这样的式子:\(\sum\limits_{t=1}^{a} \lfloor \frac{a}{t} \rfloor \lfloor \frac{b}{t} \rfloor \mu(t)\)

这题有多测,考虑如何优化?
看上去前面很像整除分块的形式,所以考虑把 \(\mu\) 内的变成一段连续的取值,可以前缀和优化,即让它们前面的除法系数相同。
然后对前面那玩意儿做整除分块就行了,由于两个分块都是 \(O(\sqrt{n})\) 级别的,所以重叠在一起还是 \(O(\sqrt{n})\) 级别。

例 3:CF803F Coprime Subsequences

给定长度为 \(n\) 的数组 \(a\),求满足如下条件的 \(a\) 的子序列个数:
子序列内所有数的 \(\gcd\)\(1\)

这也可以容斥。
具体地,用总数减去子序列都是 \(2\) 的倍数,减去都是 \(3\) 的倍数,减去都是 \(5\) 的倍数,加上都是 \(2 \times 3\) 的倍数……
又回到容斥了:\(\sum\limits_{d=1}^{v} \mu(d) \times (2^{cnt_d} - 1)\),其中 \(cnt_d\) 表示 \(d\) 的倍数的数量。
由于不能为空,所以要 \(-1\)

例 4:CF547C Mike and Foam

给定一个长度为 \(n\) 的数列 \(a\),初始每个位置都没有标记。
每次操作对一个位置的标记状态取反,并询问操作之后所有有标记的位置的集合,有多少个数对 \((i,j)\) 满足 \(\gcd(a_i, a_j) = 1\)

有点板。
这种题类似于 AT_AGC038_c(这也是一道不错的练手题),大致思路是把二维枚举通过一些转化变成一维枚举的平方
具体地,令 \(v\) 表示值域上界,令 \(cnt_i\) 表示 \(i\) 的出现次数(打标记算出现):

\(\sum\limits_{i=1}^{v} \sum\limits_{j=1}^{v} [\gcd(i,j)=1] \times cnt_i \times cnt_j\)
\(\sum\limits_{i=1}^{v} \sum\limits_{j=1}^{v} \times cnt_i \times cnt_j \sum\limits_{d ~|~ i, d ~|~ j} \mu(d)\)
\(\sum\limits_{d=1}^{v} \mu(d) \sum\limits_{i=1}^{\lfloor \frac{v}{d} \rfloor} \sum\limits_{j=1}^{\lfloor \frac{v}{d} \rfloor} cnt_{id} \times cnt_{jd}\)
\(\sum\limits_{d=1}^{v} \mu(d) \Big( \sum\limits_{i=1}^{\lfloor \frac{v}{d} \rfloor} cnt_{id} \Big) ^2\)
\(\sum\limits_{d=1}^{v} \mu(d) \Big( \sum\limits_{d | i}^{v} cnt_{i} \Big) ^2\)

由于因子个数是调和级数级别,所以直接暴力维护所有因子对应的平方权值即可。

例 5:CF900D Unusual Sequences

有一个 \(\gcd = x\) 看着就很难受,不妨把它先转化为 \(\gcd = 1\),总和为 \(\frac{y}{x}\)
\(\gcd = 1\) 看着很莫反啊!但是先别急着上 \(\mu\) 函数。
观察一下,设 \(f(n)\) 表示总和为 \(n\),且 \(\gcd = 1\) 的方案数。
莫反的本质是容斥,那就先试试容斥:用总数 \(2^{n-1}\) 减去 \(\gcd\) 不为 \(1\) 的方案数。
怎么暴力怎么来,枚举 \(n\) 的所有因数直接变成子问题求,即 \(f(n) = 2^{n-1} - \sum\limits_{d ~|~ n} f(d)\)

这样做看上去很蠢,但实际上它是对的。
加个记忆化它只会访问 \(\frac{y}{x}\) 的所有因子,这哪里有不对的道理。

例 6:

求有多少序列 \(a\) 满足:

  • \(l_i \leq a_i \leq r_i\)
  • \(\sum a_i \leq m\)
  • \(\gcd a_i = 1\)

整体思路类似于上一题,也是转化为子问题再做。

首先这个 \(\gcd = 1\) 看上去很莫反,然而这种计数题又不能强行莫反,相反地它长得还有点像 DP。
然而直接硬 DP 显然不好设计状态,所以考虑套一个容斥再去 DP:即用总数减去 \(\gcd \gt 1\) 的方案数

后面 \(\gcd \gt 1\) 的方案数怎么做?其实是子问题:

\(\gcd = d \Rightarrow l'_i \leftarrow \lceil \frac{l_i}{d} \rceil, r'_i \leftarrow \lfloor \frac{r_i}{d} \rfloor, m' \leftarrow \lfloor \frac{m}{d} \rfloor\)
然后转化为 \(\gcd = 1\) 的子问题继续递归求解。
那问题在于总数要怎么求?事实上这一个简单的 DP,设 \(f_{i,j}\) 表示前 \(i\) 个位置总和为 \(j\) 的方案数,前缀和优化转移即可做到 \(O(\frac{nm}{d})\)

写递归被卡常了,毕竟常数确实很大。
那就求出 \(\mu\) 直接枚举 \(d\),乘上对应容斥系数就行了。
看似复杂度很高,实际 \(\sum\limits_{d=1}^{m} \frac{nm}{d} = nm\sum\limits_{d=1}^{m} \frac{1}{d}\),这是调和级数级别,可以接受。


五、狄利克雷卷积(Dirichlet)

有两个数论函数 \(f,g\),令 \(h = f * g\)

\[h(n) = \sum\limits_{d | n} f(d) g(\frac{n}{d}) \]

称之为狄利克雷卷积(Dirichlet)

一些简单卷积

假设 \(f(n) = 1, g(n) = 1, h = f * g\),则有 \(h(n) = \sum\limits_{d | n} 1 \times 1\),即 \(h\)因子个数函数
假设 \(f(n) = 1, g(n) = n, h = f * g\),则有 \(h(n) = \sum\limits_{d | n} 1 \times n\),即 \(h\)因子之和函数
假设 \(f(n)\) 任意,\(g(n) = [n = 1]\)\(g\)单位函数\(h = f * g\),则有 \(h(n) = \sum\limits_{d | n} f(d) \times [\frac{n}{d} = 1]\),即 \(h(n) = f(n)\)

性质

显然卷积是满足交换律的,有 \(f * g = g * f\),由定义可得。

卷积还满足结合律,即 \((f * g) * h = f * (g * h)\)
注意迪利克雷卷积的另一种写法:\(h(n) = \sum\limits_{d_1d_2 = n} f(d_1) g(d_2)\)
那这里相当于是把 \(n\) 分成三部分:\(n=d_1d_2d_3\),再扔回上面那个式子里面显然是满足结合律的。

另外若 \(f,g\) 都是积性函数,那么 \(h\) 也是积性函数。即两个积性函数的卷积仍然是积性函数

六、莫比乌斯反演(Hard Version)

一般形式 & 性质

\[\Large F(x) = \sum\limits_{d ~|~ x} f(d) \Rightarrow f(x) = \sum\limits_{d ~|~ x} \mu(d) F(\frac{x}{d}) \]

\[\Large F(x) = \sum\limits_{x ~|~ d} f(d) \Rightarrow f(x) = \sum\limits_{x ~|~ d} \mu(\frac{d}{x}) F(d) \]

\[\Large \sum\limits_{d | x} \mu(d) = [x = 1] \]

事实上前两个也是类似于容斥的东西,列举一下容斥系数就是 \(\mu\)
bf0ce9d5f2a1e7e2b1630d83c360bd24.png

然而第三个式子为什么是对的?
考虑把 \(\mu\) 做一个狄利克雷卷积:\(\mu * I = \epsilon\)
翻译成人话:\(\sum\limits_{d | n} \mu(d) = [n = 1]\),也就是第三个式子。
证明的话只需要考虑指数幂处的取值即可。

顺便证一下第一个式子:

\(F(x) = \sum\limits_{d ~|~ x} f(d)\),即 \(F = f * I\)
那等式两边同时卷上一个 \(\mu\) 等式显然成立:\(F * \mu = f * I * \mu\)
根据结合律,\(F * \mu = f * (I * \mu)\),然而第三个式子证过 \(I * \mu = \epsilon\),所以 \(F * \mu = f * \epsilon\)
又因为之前在狄利克雷卷积那里证过:

假设 \(f(n)\) 任意,\(g(n) = [n = 1]\)\(g\)单位函数\(h = f * g\),则有 \(h(n) = \sum\limits_{d | n} f(d) \times [\frac{n}{d} = 1]\),即 \(h(n) = f(n)\)

所以 \(F * \mu = f\),即 \(f(x) = \sum\limits_{d ~|~ x} \mu(d) F(\frac{x}{d})\)
把莫比乌斯反演写成狄利克雷卷积的形式:\(F = f * I \Rightarrow f = F * \mu\)

常见问题

给定函数 \(f\),计算 \(\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} f(\gcd(i,j))\)

对于 \(f(n) = [n=1]\) 就是互质情况,这种特殊问题之前已经处理过了,考虑用狄利克雷卷积解决它。

\(f(n) = \sum\limits_{d ~|~ n} g(n)\)
则问题变成计算 \(\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sum\limits_{d ~|~ \gcd(i,j)} g(d)\)
改为枚举 \(d\) 再计算:\(\sum\limits_{d=1}^{\min(n,m)} g(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor\)

对于 \(f(n) = [n=1]\) 的特殊情况,相当于 \(\epsilon = g * I\),由之前推导可得 \(g = \mu\)

例 2:洛谷 P3455 POI 2007 ZAP-Queries

给出 \(a,b,d\),求满足 \(1 \leq x \leq a\)\(1 \leq y \leq b\),且 \(\gcd(x,y)=d\) 的二元组 \((x,y)\) 的数量。

一种做法是上界除以 \(d\) 下取整,然后转化为 \(\gcd = 1\) 的问题欧拉反演。

学完迪利克雷卷积,考虑再从反演的更高维层面思考这个问题,虽然最后得到的结果都是一样的

为什么要莫反?因为需要通过容斥把问题转化为可以快速计算或更简洁的形式。
\(f(d) = \sum\limits_{i=1}^{a} \sum\limits_{j=1}^{b} [\gcd(i,j) == d]\),这并不好求。
由于莫反本质上是因子与倍数的关系,考虑往因子转化还是往倍数转化。
往因子转化看上去比较地神秘,又变成了一大坨子问题,还是解决不了。
但是往倍数转化:设 \(g(n) = \sum\limits_{n ~|~ d} f(d) = \sum\limits_{n ~|~ d} \sum\limits_{i=1}^{a} \sum\limits_{j=1}^{b} [\gcd(i,j) == d]\),由于 \(i,j\) 都是 \(d\) 的倍数,因此它们也一定都是 \(n\) 的倍数。
所以 \(g(n) = \lfloor \frac{a}{n} \rfloor \lfloor \frac{b}{n} \rfloor\)

然后根据莫反的一般形式把 \(f\) 往里面扔:\(f(d) = \sum\limits_{d ~|~ t} \mu(\frac{t}{d}) \lfloor \frac{a}{t} \rfloor \lfloor \frac{b}{t} \rfloor\)
改为枚举 \(T=\frac{t}{d}\),式子变为:\(\sum\limits_{T=1}^{\lfloor \frac{\min(a,b)}{d} \rfloor} \mu(T) \lfloor \frac{a}{Td} \rfloor \lfloor \frac{a}{Td} \rfloor\)
优化就和之前一样了,整除分块前缀和。

例 7:洛谷 P2398 GCD SUM

\(\sum_{i=1}^n \sum_{j=1}^n \gcd(i, j)\)

看到 \(\gcd\) 求和,很难啊!直接把贡献拆出来改成计数:\(\sum\limits_{d} d \times \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} [\gcd(i,j) = d]\)
然后就做完了,后面那坨就是之前已经解决的问题。

例 8:洛谷 P2257 YY 的 GCD

给定 \(N, M\),求 \(1 \leq x \leq N\)\(1 \leq y \leq M\)\(\gcd(x, y)\) 为质数的 \((x, y)\) 有多少对。

如果用前两种转化好像挺难优化复杂度。
考虑第三种形式:\(\sum\limits_{d | x} \mu(d) = [x = 1]\)

\[\sum\limits_{p \in prime} \sum\limits_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum\limits_{j=1}^{\lfloor \frac{m}{p} \rfloor} [\gcd(i,j) = 1] \]

\[\sum\limits_{p \in prime} \sum\limits_{i=1}^{\lfloor \frac{n}{p} \rfloor} \sum\limits_{j=1}^{\lfloor \frac{m}{p} \rfloor} \sum\limits_{d ~|~ i,~ d ~|~ j} \mu(d) \]

改成枚举 \(d\)

\[\sum\limits_{p \in prime} \sum\limits_{d=1}^{\lfloor \frac{\min(n,m)}{p} \rfloor} \lfloor \frac{n}{dp} \rfloor \lfloor \frac{m}{dp} \rfloor \mu(d) \]

现在貌似并不能再优化了?
瓶颈在于多测,而每一次多测都要重新算一遍贡献。
那能否转化成预处理的形式?
\(T = dp\),改为枚举 \(T\)

\[\sum\limits_{T=1}^{\min(n,m)} \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \sum\limits_{p ~|~ T, p \in prime} \mu(\frac{T}{p}) \]

后面的 \(\sum\limits_{p ~|~ T, p \in prime} \mu(\frac{T}{p})\) 就和询问 \(n,m\) 完全无关了,可以预处理。
对于前面 \(\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor\) 可以直接数论分块,后面的预处理加一层前缀和即可。

更多的例题还是看之前写的吧,专题太多了忙不过来,没时间再写一遍题解了。

$$\Large\Rightarrow \color{red}{远古莫反题解合集}\Leftarrow$$


七、欧拉反演

直接给出结论:

\[\Large n = \sum\limits_{d ~|~ n} \varphi(d) \]

比较玄幻了,狄利克雷卷积其实可以把 \(\mu\)\(\varphi\) 这俩玩意儿联系起来。

考虑 \(f(n) = n, g(n) = \mu(n)\),且 \(h = f * g\),求 \(h\) 是什么函数。

\(f\)\(id\)\(g = \mu\),有 \(h = id * \mu\)
由于 \(id,\mu\) 都是积性函数,只需要考虑在素数幂处的取值,因为它们卷起来还是积性函数。
卷起来就是 \(h(p^\alpha) = \sum\limits_{d ~|~ p^\alpha} d \mu(\frac{p^\alpha}{d})\)
\(d = p^\alpha\),算出来是 \(p^\alpha\);当 \(d = p^{\alpha - 1}\),算出来是 \(-p^{\alpha - 1}\);其余情况由于 \(\mu\) 包含至少两个质因子,都是 \(0\)
所以这东西卷起来就是 \(p^\alpha - p^{\alpha - 1}\),事实上是 \(\varphi\) 欧拉函数。
于是有:

\[id * \mu = \varphi \]

然后和推导莫比乌斯反演类似地,两边同时卷一个 \(I\),运用结合律,由于 \(\mu * I = \epsilon\),且任何函数卷 \(\epsilon\) 都是它本身:

\[Id = \varphi * I \]

这是一个很牛的事情,翻译成人话就是:\(n = \sum\limits_{d ~|~ n} \varphi(d)\),即欧拉反演

例 9:ARC185E Adjacent GCD

首先不难一眼看出拆贡献,计算每一个二元组 \((i,j)\) 被计算了多少次。
然后这显然是 \(2^{i-1} \times 2^{n-j} = 2^{n+i-j-1}\),即 \(\sum\limits_{i=1}^{n} \sum\limits_{j=i+1}^{n} \gcd(a_i, a_j) 2^{n+i-j-1}\)
题目要求求出所有前缀的答案,这启发我们增量,计算新加一个数 \(a_n\) 的贡献。
由于后面有 \(2^{n}\) 这一项,所以当 \(n \leftarrow n+1\) 的时候之前的答案都要 \(\times 2\)
然后考虑新的数对 \((i,n)\) 的贡献(接下来钦定 \(a_n = m\)):

\(\sum\limits_{i=1}^{n-1} \gcd(a_i, m) \times 2^{i-1}\)
事实上我试了一下莫反,但是推了半天之后发现推成欧拉反演了。
那就用欧拉反演吧,把 \(\gcd\) 化掉:\(\sum\limits_{i=1}^{n-1} 2^{i-1} \sum\limits_{d ~|~ a_i, d ~|~ m} \varphi(d)\)
都写到这一步了,显然要把 \(d\) 提到前面:\(\sum\limits_{d ~|~ m} \varphi(d) \sum\limits_{i=1}^{n-1} [d ~|~ a_i] 2^{i-1}\)

接下来就和例 5 很像了。直接遍历所有因子暴力修改贡献即可,这是不难维护的。

posted @ 2025-05-05 15:43  Conan15  阅读(30)  评论(0)    收藏  举报  来源