# 反演与狄利克雷卷积

## 1. 本质与第一反演公式

### 1.2. 第一反演公式

$v_n = \sum_{i = 1} ^ n c_{n, i} u_i \Leftrightarrow u_n = \sum_{i = 1} ^ n d_{n, i} v_i$

$\begin{bmatrix} c_{1, 1} & 0 & \cdots & 0 & 0 \\ c_{2, 1} & c_{2, 2} & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ c_{n - 1, 1} & c_{n - 1, 2} & \cdots & c_{n - 1, n - 1} & 0 \\ c_{n, 1} & c_{n, 2} & \cdots & c_{n, n - 1} & c_{n, n} \end{bmatrix} \begin{bmatrix} q_1 \\ q_2 \\ \vdots \\ q_{n - 1} \\ q_n \end{bmatrix} = \begin{bmatrix} p_1 \\ p_2 \\ \vdots \\ p_{n - 1} \\ p_n \end{bmatrix}$

$\begin{bmatrix} c_{1, 1} & 0 & \cdots & 0 & 0 \\ c_{2, 1} & c_{2, 2} & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ c_{n - 1, 1} & c_{n - 1, 2} & \cdots & c_{n - 1, n - 1} & 0 \\ c_{n, 1} & c_{n, 2} & \cdots & c_{n, n - 1} & c_{n, n} \end{bmatrix} \begin{bmatrix} d_{1, 1} & 0 & \cdots & 0 & 0 \\ d_{2, 1} & d_{2, 2} & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ d_{n - 1, 1} & d_{n - 1, 2} & \cdots & d_{n - 1, n - 1} & 0 \\ d_{n, 1} & d_{n, 2} & \cdots & d_{n, n - 1} & d_{n, n} \end{bmatrix} = \mathbf{I}$

## 2. 二项式反演

### 2.1. 引入

$x ^ n = (1 + x - 1) ^ n = \sum_{i = 0} ^ n \dbinom n i 1 ^ {n - i} (x - 1) ^ i = \sum_{i = 0} ^ n \dbinom n i (x - 1) ^ i$

$(x - 1) ^ n = \sum_{i = 0} ^ n \dbinom n i (-1) ^ {n - i} x ^ i$

$f_n = \sum_{i = 0} ^ n \dbinom n i g_i \Leftrightarrow g_n = \sum_{i = 0} ^ n (-1) ^ {n - i} \dbinom n i f_i$

\begin{aligned} f_n = & \sum_{i = 0} ^ n \dbinom n i \sum_{j = 0} ^ i (-1) ^ {i - j} \dbinom i j f_j \\ = & \sum_{j = 0} ^ n f_j \sum_{i = j} ^ n (-1) ^ {i - j} \dbinom n i \dbinom i j \\ = & \sum_{j = 0} ^ n f_j \dbinom n j \sum_{i = j} ^ n (-1) ^ {i - j} \dbinom {n - j} {i - j} \\ = & \sum_{j = 0} ^ n f_j \dbinom n j \sum_{t = 0} ^ {n - j} (-1) ^ t \dbinom {n - j} t \end{aligned}

$\begin{bmatrix} \dbinom 0 0 & 0 & \cdots & 0 & 0 \\ \dbinom 1 0 & \dbinom 1 1 & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ \dbinom {n - 1} 0 & \dbinom {n - 1} 1 & \cdots & \dbinom {n - 1} {n - 1} & 0 \\ \dbinom n 0 & \dbinom n 1 & \cdots & \dbinom n {n - 1} & \dbinom n n \end{bmatrix} \begin{bmatrix} \dbinom 0 0 & 0 & \cdots & 0 & 0 \\ -\dbinom 1 0 & \dbinom 1 1 & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ (-1) ^ {n - 1}\dbinom {n - 1} 0 & (-1) ^ {n - 2}\dbinom {n - 1} 1 & \cdots & \dbinom {n - 1} {n - 1} & 0 \\ (-1) ^ n \dbinom n 0 & (-1) ^ {n - 1} \dbinom n 1 & \cdots & -\dbinom n {n - 1} & \dbinom n n \end{bmatrix} = \mathbf{I}$

$f_i = \sum_{j = i} ^ n \dbinom j i g_j \Leftrightarrow g_i = \sum_{j = i} ^ n (-1) ^ {j - i} \dbinom j i f_j$

$\begin{bmatrix} \dbinom 0 0 & \dbinom 1 0 & \cdots & \dbinom {n - 1} 0 & \dbinom n 0 \\ 0 & \dbinom 1 1 & \cdots & \dbinom {n - 1} 1 & \dbinom n 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & \cdots & \dbinom {n - 1} {n - 1} & \dbinom n {n - 1} \\ 0 & 0 & \cdots & 0 & \dbinom n n \end{bmatrix} \begin{bmatrix} \dbinom 0 0 & -\dbinom 1 0 & \cdots & (-1) ^ {n - 1}\dbinom {n - 1} 0 & (-1) ^ n \dbinom n 0 \\ 0 & \dbinom 1 1 & \cdots & (-1) ^ {n - 2}\dbinom {n - 1} 1 & (-1) ^ {n - 1} \dbinom n 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & \cdots & \dbinom {n - 1} {n - 1} & -\dbinom n {n - 1} \\ 0 & 0 & \cdots & 0 & \dbinom n n \end{bmatrix} = \mathbf{I}$

### 2.3. 应用

OI 界二项式反演的应用常结合动态规划：DP 求出钦定选择 $$i$$ 个元素时的总方案，然后就可以通过二项式反演得到恰好选择 $$i$$ 个元素时的方案数。综上所述，我们总结出二项式定理的核心：通过二项式系数的容斥进行 “钦定” 和 “恰好” 的转换

#### 2.3.1. 错排问题

$$n$$ 个人排列，求每个人都恰好站错的方案数。即求 $$\sum_{\\p} [\forall i, \ p_i\neq i]$$

$$g_n$$ 表示 $$n$$ 个人的错排方案数，而 $$f_n$$ 表示所有排列方案数即 $$n!$$。那么有 $$f_n = \sum_{\\i = 0} ^ n \dbinom n i g_i$$$$i$$ 的意义是枚举站错的人的个数。反演得到 $$g_n = \sum_{\\i = 0} ^ n (-1) ^ {n-i} \dbinom n i f_i = \sum_{i=0} ^ n (-1) ^ {n - i} \dfrac {n!} {(n-i)!}$$（组合数分母上的 $$i!$$$$f_i$$ 抵消了）。

#### 2.3.2. 染色问题 I（一维）

$$n$$ 个格子，$$k$$ 种颜色，相邻格子颜色不同，每个颜色至少出现一次，求方案数。

$$g_k$$ 表示恰好出现 $$k$$ 个颜色的方案数，$$f_k$$ 表示 $$k$$ 个颜色的总方案数，即 $$k \times (k - 1) ^ {n - 1}$$。有

$f_k = \sum_{\\i = 0} ^ k \dbinom k i g_i$

#### 2.3.3. 染色问题 II（二维）

$$n\times m$$ 个格子，$$1$$ 种颜色，每行和每列至少有一个格子被涂色，求方案数。

$$g_{i, j}$$ 表示恰好有 $$i$$$$j$$ 列被涂色的方案数，$$f_{i, j}$$ 表示 $$i$$$$j$$ 列被涂色的方案数即 $$2 ^ {ij}$$，有

$f_{n, m} = \sum_{\\i = 0} ^ n \dbinom n i \sum_{\\j = 0} ^ m \dbinom m j g_{i, j}$

$$i$$$$j$$ 分别二项式反演，有

$g_{n, m} = \sum_{\\i = 0} ^ n \sum_{\\j = 0} ^ m (-1) ^ {(n - i) + (m - j)} \dbinom n i \dbinom m jf_{i,j}$

#### 2.3.4. 染色问题 III（三维）

$$n\times m$$ 个格子，$$k$$ 种颜色，每行和每列至少一个格子被涂色，每个颜色至少出现一次，格子可不被涂色，求方案数。

$f_{n, m, k} = \sum_{i = 0} ^ n \sum_{j = 0} ^ m \sum_{p = 0} ^ k \dbinom n i \dbinom m j \dbinom k p g_{i, j, k}$

$g_{n, m, k} = \sum_{i = 0} ^ n \sum_{j = 0} ^ m \sum_{p = 0} ^ k (-1) ^ {n + m + k - i - j - p} \dbinom n i \dbinom m j \dbinom k p (p + 1) ^ {ij}$

### 2.5. 例题

#### *II. P4859 已经没有什么好害怕的了

const int mod = 1e9 + 9;
const int N = 2e3 + 5;
int n, k, ans, a[N], b[N], num[N], f[N], fc[N], ifc[N];
void add(int &x, int y) {x += y, x >= mod && (x -= mod);}
int ksm(int a, int b) {
int s = 1;
while(b) {
if(b & 1) s = 1ll * s * a % mod;
a = 1ll * a * a % mod, b >>= 1;
} return s;
}
int main(){
cin >> n >> k;
if((n & 1) != (k & 1)) return puts("0"), 0;
k = n + k >> 1, fc[0] = 1;
for(int i = 1; i <= n; i++) fc[i] = 1ll * fc[i - 1] * i % mod;
ifc[n] = ksm(fc[n], mod - 2);
for(int i = n - 1; ~i; i--) ifc[i] = 1ll * ifc[i + 1] * (i + 1) % mod;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) cin >> b[i];
sort(a + 1, a + n + 1), sort(b + 1, b + n + 1);
for(int i = 1; i <= n; i++) {
num[i] = num[i - 1];
while(num[i] < n && a[i] > b[num[i] + 1]) num[i]++;
} f[0] = 1;
for(int i = 1; i <= n; i++)
for(int j = min(num[i], i); j; j--)
add(f[j], 1ll * f[j - 1] * (num[i] - j + 1) % mod);
for(int i = k; i <= n; i++) {
int bin = 1ll * fc[i] * ifc[k] % mod * ifc[i - k] % mod;
int coef = 1ll * bin * f[i] % mod * fc[n - i] % mod;
add(ans, (i - k) & 1 ? mod - coef : coef);
} cout << ans << endl;
return 0;
}


#### *III. CF1228E Another Filling the Grid

$$g_{i, j}$$ 表示恰有 $$i$$$$j$$ 列的最小值为 $$1$$。若钦定最小值为 $$1$$ 无法计算，但钦定最小值不为 $$1$$ 就很好算了。因此我们设 $$f_{i, j}$$ 表示钦定 $$i$$$$j$$ 列使得其它行列的最小值非 $$1$$ 的方案数，即 $$(k - 1) ^ {(n - i)(n - j)} \times k ^ {n ^ 2 - (n - i)(n - j)}$$，那么有

$f_{n, n} = \sum_{\\i = 0} ^ n \sum_{j = 0} ^ n \dbinom n i \dbinom n j g_{i, j}$

$g_{n, n} = \sum_{\\i = 0} ^ n \sum_{j = 0} ^ n (-1) ^ {n - i + n - j} \dbinom n i \dbinom n j f_{i, j}$

#### V. [BZOJ4665]小 w 的喜糖

$f_i = \sum_{\\j = i} ^ n \dbinom i j g_j$

## 3. 单位根反演

### 3.1. 公式

$[n\mid x]=\dfrac{1}{n}\sum_{i=0}^{n-1}\omega_n^{xi}$

$[x\equiv y\pmod n]=[x-y\equiv 0\pmod n]=\dfrac{1}{n}\sum_{i=0}^{n-1}\omega_n^{(x-y)i}$

### 3.2. 应用

#### 3.2.1. 将 mod 转化为求和

$\dfrac{1}{4}\sum_{i=0}^n\dbinom{n}{i}s^i\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{(i-j)k}$

$\dfrac 1 4\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{-jk}\sum_{i=0}^n\dbinom{n}{i}(s\omega_4^k)^i\times 1^{n-i}$

$\dfrac14\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{-jk}(s\omega_4^k+1)^n$

### 3.3. 例题

#### *II. P5591 小猪佩奇学数学

$\dfrac{1}{k}\sum_{i=0}^n\dbinom n i\times p^i\times (i-i\bmod k)$

• 前半部分：$$\sum_{\\i=0}^n\dbinom n i p^i\times i$$

根据 $$\dbinom{n}{m}=\dfrac n m\dbinom {n-1}{m-1}$$，得 $$np\sum_{\\i=0}^n\dbinom {n-1}{i-1} p^ {i-1}$$

$$np(p+1)^{n-1}$$

• 后半部分：略去负号，得 $$\sum_{\\i=0}^{n}\dbinom{n}{i}p^i\sum_{\\j=0}^{k-1}j[i\equiv j\pmod k]$$

套入单位根反演，得 $$\sum_{\\i=0}^n\dbinom n ip^i\sum_{\\j=0}^{k-1}\dfrac j k\sum_{\\x=0}^{k-1}\omega_k^{(i-j)x}$$

略去 $$\dfrac 1 k$$，交换求和符号，得 $$\sum_{\\j=0}^{k-1}j\sum_{\\x=0}^{k-1}\omega_k^{-jx}\sum_{\\i=0}^n\dbinom ni(p\omega_k^x)^i$$

套入二项式定理，得 $$\sum_{\\j=0}^{k-1}j\sum_{\\x=0}^{k-1}\omega_k^{-jx}(p\omega_k^x+1)^n$$

然后发现不会了。交换求和顺序，得 $$\sum_{\\x=0}^{k-1}(p\omega_k^x+1)^n\sum_{\\j=0}^{k-1}j(\omega_k^x)^{-j}$$

略去前面的柿子，将 $$\omega_k^{-x}$$ 记做 $$c$$，仅关注 $$\sum_{\\j=0}^{k-1}jc^{j}$$。由于 $$k$$ 是常数，因此将其记做 $$f(c)$$。看到这里，你发现了什么？对！是我们小学二年级就学过的错位相减法！

• 如果 $$c\neq 1$$，求 $$cf(c)-f(c)$$：比对每一项的系数，有 $$f(c)-cf(c)=\sum_{\\j=1}^{k-1}c^j-(k-1)c^k$$

先特判掉 $$k=1$$ 的情况，然后用等比数列求和公式得到 $$\sum_{\\j=1}^{k-1}c^j=-1+\sum_{\\j=0}^{k-1}c^j=-1+\dfrac{c^k-1}{c-1}$$，注意到 $$c^k$$ 恒为 $$1$$，所以 $$f(c)=\dfrac{-1-(k-1)}{1-c}=\dfrac{k}{c-1}$$

• 如果 $$c=1$$，那么原式等于 $$\sum_{\\j=0}^{k-1}j=\dfrac{k(k-1)}2$$

因此直接计算即可！时间复杂度 $$\mathcal{O}(k\log n)$$

ll n, p, k, w, ans, sub;
int main() {
cin >> n >> p >> k, w = ksm(3, (mod - 1) / k);
ans = n * p % mod * ksm(p + 1, n - 1) % mod;
for(int x = 0; x < k; x++) {
ll om = ksm(w, x), pw = ksm(p * om + 1, n), c = inv(om);
if(c == 1) sub = (sub + pw * (k * (k - 1) / 2 % mod)) % mod;
else sub = (sub + pw * k % mod * inv(mod + c - 1)) % mod;
} cout << (ans + mod - sub * inv(k) % mod) * inv(k) % mod;
return 0;
}


## 4. 莫比乌斯反演

### 4.1. 前置知识

#### 4.1.1. 数论函数与积性函数

• 单位函数 $$\epsilon(n)=[n=1]$$
• 常数函数 $$1(n)=1$$
• 恒等函数 $$\mathrm{id}_k(n)=n^k$$$$\mathrm{id}_1(n)$$ 通常记作 $$\mathrm {id}(n)$$
• 除数函数 $$\sigma_k(n)=\sum_{\\d\mid n}d^k$$$$\sigma_0(n)$$ 就是约数个数，记作 $$\tau(n)$$$$\mathrm{d}(n)$$$$\sigma_1(n)$$ 就是约数和，记作 $$\sigma(n)$$
• 大名鼎鼎的欧拉函数 $$\varphi(n)=\sum_{\\i=1}^n[\gcd(i,n)=1]$$。关于欧拉函数可以看 基础数论学习笔记
• 本章节的核心莫比乌斯函数 $$\mu(n)=\begin{cases}0&\exist\ d>1,d^2\mid n \\(-1)^{\omega(n)}&\mathrm{otherwise}\end{cases}$$，其中 $$\omega(n)$$ 表示 $$n$$ 本质不同质因子个数。它的积性是显然的。

#### 4.1.2. 狄利克雷卷积

FMT 和 FWT 叫位运算卷积，FFT 和 NTT 叫加法卷积，不难发现狄利克雷卷积实际上是乘法卷积。它有如下性质：两个积性函数的狄利克雷卷积也是积性函数，积性函数的逆元也是积性函数。证明略。

#### 4.1.3. 莫比乌斯函数

$\sum_{d\mid n}\mu(d)=\begin{cases}1&n=1\\0&n\neq 1\end{cases} \tag{4.1}$

$\varphi(n)=\sum_{d\mid n}d\times \mu\left(\dfrac n d\right) \tag{4.2}$

$\dfrac{\varphi(n)}n=\sum_{d\mid n} \dfrac{\mu(d)}{d}\tag{4.2.2}$

$\sum_{d\mid \gcd(i,j)}\mu(d)=[\gcd(i,j)=1]\tag{4.3}$

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


### 4.2. 公式

$$f,g$$ 是两个数论函数，那么有

$f(n)=\sum_{d\mid n}g(d)\Rightarrow g(n)=\sum_{d\mid n}\mu(d)f\left(\dfrac n d\right) \tag{4.4}$

$f(n)=\sum_{n\mid d}g(d)\Rightarrow g(n)=\sum_{n\mid d}\mu\left(\dfrac d n\right)f(d) \tag{4.5}$

\begin{aligned}&\sum_{n\mid d}\mu\left(\dfrac d n\right)f(d)\\=&\sum_{k=1}^{+\infty}\mu(k)f(kn)\\=&\sum_{k=1}^{+\infty}\mu(k)\sum_{kn\mid d}g(d)\\=&\sum_{n\mid d}g(d)\sum_{k\mid \frac d n}\mu(k)\\=&\sum_{n\mid d}g(d)\epsilon\left(\dfrac d n\right)\\=&g(n)\end{aligned}

### 4.3. 直观理解

#### 4.3.1. $$n=2$$

$$n=2$$ 时，为了求出 $$g_2$$，我们只需要用 $$f_2-f_1=(g_2+g_1)-g_1$$。这里已经可以看见容斥的影子了。

#### 4.3.2. $$n=6$$ 及 $$\prod p_i$$

$$n=6$$ 时，为了求出 $$g_6$$，我们首先需要 $$f_6$$，但是这样会多加 $$g_1+g_2+g_3$$，所以减去 $$f_2+f_3$$，但是这样又多减了 $$g_1$$，所以我们还应加上 $$f_1$$

### 4.5. 例题

#### I. P2522 [HAOI2011]Problem b

$\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]$

$$k$$ 搞掉：

$\sum_{i=1}^{\frac {n}{k}}\sum_{j=1}^{\frac {m}{k}}[\gcd(i,j)=1]$

$\sum_{i=1}^{\frac n k}\sum_{j=1}^{\frac m k}\sum_{d\mid \gcd(i,j)}\mu(d)$

$\sum_{d=1}^{c}\mu(d)\sum_{i=1}^{\frac n k}[d\mid i]\sum_{j=1}^{\frac m k}[d\mid j]$

$\sum_{d=1}^{c}\mu(d)\dfrac n{kd}\dfrac m{kd}$

#### II. SP5971 LCM Sum

$\sum_{i=1}^n\mathrm{lcm}(i,n)= n\sum_{i=1}^n\dfrac {i}{\gcd(i,n)}$

$$\gcd$$ 在分母的位置，很不爽，尝试枚举 $$\gcd$$

\begin{aligned}&\ n\sum_{i=1}^n i\sum_{d\mid n}\dfrac{1}{d}[\gcd(i,n)=d] \\ =&\ n \sum_{d\mid n}\dfrac{1}{d}\sum_{i=1}^n i[\gcd(i,n)=d] \\ =&\ n\sum_{d\mid n}\dfrac d d \sum_{i=1}^{\frac n d}i\left[\gcd\left(i,\dfrac n d\right)=1\right] \\=&\ n\sum_{d\mid n}\sum_{i=1}^di[\gcd(i,d)=1] \\=&\ n\sum_{d\mid n}F(d) \end{aligned}

\begin{aligned}&\ F(n) \\=&\ \sum_{i=1}^ni\sum_{d\mid \gcd(i,n)}\mu(d) \\=&\ \sum_{d\mid n}\mu(d)\sum_{i=1}^{\frac n d} id \\=&\ \sum_{d\mid n}\mu(d)d\times\dfrac{\frac n d\left(1+\frac n d\right)}{2} \end{aligned}

\begin{aligned} &\ F(n) \\= &\ \dfrac n 2\sum_{d\mid n}\mu(d)\left(1+\dfrac n d\right) \\= &\ \dfrac{n(\epsilon(n)+\varphi(n))}{2} \end{aligned}

const int N = 1e6 + 5;
ll T, pr[N], G[N], low[N], cnt;
bool vis[N];
void sieve() {
G[1] = 1;
for(int i = 2; i < N; i++) {
if(!vis[i]) pr[++cnt] = i, G[i] = 1 + 1ll * i * (i - 1), low[i] = i;
for(int j = 1; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) {
low[i * pr[j]] = low[i] * pr[j];
if(i == low[i]) G[i * pr[j]] = G[i] + low[i] * (pr[j] - 1) * low[i] * pr[j];
else G[i * pr[j]] = G[i / low[i]] * G[low[i] * pr[j]]; break;
} G[i * pr[j]] = G[i] * G[pr[j]], low[i * pr[j]] = pr[j];
}
}
}
int main(){
cin >> T, sieve();
while(T--) {
print((G[n] + 1) * n / 2), pc('\n');
} return flush(), 0;
}


#### *III. P4318 完全平方数

const int N = 1e5 + 5;
int T, n, cnt, pr[N], vis[N], mu[N];
int main() {
cin >> T, mu[1] = 1;
for(int i = 2; i < N;i++) {
if(!vis[i]) pr[++cnt] = i, mu[i] = -1;
for(int j = 1; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) break;
mu[i * pr[j]] = -mu[i];
}
} while(T--){
cin >> n; ll l = n, r = n << 1;
while(l < r) {
ll m = l + r >> 1, res = 0;
for(int i = 1; i * i <= m; i++) res += mu[i] * (x / i / i);
res < n ? l = m + 1 : r = m;
} cout << l << endl;
} return 0;
}


#### IV. P2257 YY 的 GCD

\begin{aligned} &\ \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)\in\mathbb{P}]\\ =&\ \sum_{p\in \mathbb P}\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=p]\\ =&\ \sum_{p\in \mathbb P}\sum_{i=1}^{\frac n p}\sum_{i=1}^{\frac m p}[\gcd(i,j)=1]\\ =&\ \sum_{p\in \mathbb P}\sum_{i=1}^{\frac n p}\sum_{i=1}^{\frac m p}\sum_{d\mid \gcd(i,j)}\mu(d)\\ =&\ \sum_{p\in \mathbb P}\sum_{d=1}^{\min(\frac np,\frac mp)}\mu(d)\dfrac{n}{pd}\dfrac{m}{pd} \end{aligned}

$\sum_{T=1}^{\min(n,m)}\sum_{p\mid T\land p\in\mathbb P}^{T}\dfrac nT\dfrac mT\mu\left(\dfrac T p\right)$

*另一种推导方式：考虑对 $$[\gcd(i,j)=p]$$ 进行容斥并用莫比乌斯函数作容斥系数：$$\sum_{i=1}^n\sum_{j=1}^m\sum_{\\d=kp}\mu(k)[d\mid \gcd(i,j)]$$，相当于 $$\mu$$ 乘上 $$\epsilon_p(i)$$$$[i=p]\ (p\in \mathbb P)$$，然后求和。稍作化简得到 $$\sum_{\\d=1}^{\min(n,m)}\dfrac n d \dfrac m d\sum_{\\p\mid d\land p\in\mathbb P}\mu\left(\dfrac{n}{p}\right)$$，发现与上述柿子等价。

$$f(T)=\sum_{\\p\mid T\land p\in \mathbb P} \mu\left(\dfrac T p\right)$$ 可以通过类似埃氏筛的筛法 $$n\log\log n$$ 求出，前缀和之后整除分块即可。总时间复杂度 $$\mathcal{O}(T\sqrt n+n\log \log n)$$$$f(T)$$ 还可以线性筛，具体推导过程略去，复杂度 $$\mathcal{O}(T\sqrt n+n)$$​。

const int N = 1e7 + 5;
int T, n, m, cnt, vis[N], pr[N >> 3], f[N], mu[N];
int main(){
for(int i = 2; i < N; i++) {
if(!vis[i]) pr[++cnt] = i, f[i] = 1, mu[i] = -1;
for(int j = 1; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) {f[i * pr[j]] = mu[i]; break;}
f[i * pr[j]] = -f[i] + mu[i], mu[i * pr[j]] = -mu[i];
}
} for(int i = 2; i < N; i++) f[i] += f[i - 1]; cin >> T;
while(T--) {
nll ans = 0 cin >> n >> m;
for(int l = 1, r; l <= min(n, m); l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans += 1ll * (n / l) * (m / l) * (f[r] - f[l - 1]);
} cout << ans << "\n";
}
return 0;
}


#### VII. P1829 [国家集训队]Crash的数字表格 / JZPTAB

\begin{aligned} &\ \sum_{i=1}^n\sum_{j=1}^m\mathrm{lcm}(i,j)\\ =&\ \sum_{i=1}^n\sum_{j=1}^m\dfrac{ij}{\gcd(i,j)}\\ =&\ \sum_{d=1}^{\min(n,m)}\dfrac{1}{d}\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}ijd^2\sum_{k\mid \gcd(i,j)}\mu(k)\\ =&\ \sum_{d=1}^{\min(n,m)}d\sum_{k=1}^{\min(\frac n d\frac m d)}\mu(k)k^2\sum_{i=1}^{\frac n {kd}}i\sum_{j=1}^{\frac m {kd}}j\\ =&\ \sum_{d=1}^{\min(n,m)}d\sum_{k=1}^{\min(\frac n d\frac m d)}\mu(k)k^2S\left(\dfrac n{kd}\right)S\left(\dfrac{m}{kd}\right) \end{aligned}

\begin{aligned} =&\ \sum_{T=1}^{\min(n,m)}S\left(\dfrac nT\right)S\left(\dfrac{m}T\right)\sum_{k\mid T}\mu(k)k^2\dfrac{T}k\\ \end{aligned}

const int N = 1e7 + 5;
const int mod = 20101009;
int n, m, c, pr[N >> 3], cnt, low[N];
bool vis[N]; ll f[N], ans;
ll S(ll x) {return x * (x + 1) / 2 % mod;}
int main(){
cin >> n >> m, c = min(n, m), f[1] = 1;
for(ll i = 2; i <= c; i++) {
if(!vis[i]) low[i] = pr[++cnt] = i, f[i] = (i - i * i % mod + mod) % mod;
for(int j = 1; j <= cnt && i * pr[j] <= c; j++) {
int k = i * pr[j]; vis[k] = 1;
if(i % pr[j] == 0) {
low[k] = low[i] * pr[j];
if(low[i] == i) f[k] = (k - pr[j] * pr[j] % mod * i % mod + mod) % mod;
else f[k] = f[i / low[i]] * f[low[k]] % mod; break;
} low[k] = pr[j], f[k] = f[i] * f[pr[j]] % mod;
}
}
for(int i = 2; i <= c; i++) f[i] = (f[i] + f[i - 1]) % mod;
for(int l = 1, r; l <= c; l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans = (ans + S(n / l) * S(m / l) % mod * (f[r] - f[l - 1] + mod)) % mod;
} cout << ans << endl;
return 0;
}


#### VIII. AT5200 [AGC038C] LCMs

\begin{aligned} &\ \sum_{i=1}^V\sum_{j=1}^Vb_ib_j\times\mathrm{lcm}(i,j)\\ =&\ \sum_{i=1}^v\sum_{j=1}^v\dfrac{ij\times b_ib_j}{\gcd(i,j)}\\ \end{aligned}

const int N = 1e6 + 5;
const int mod = 998244353;
int n, f[N], cnt, mx, pr[N >> 3];
ll b[N], inv[N], ans; bool vis[N];
int main(){
cin >> n, f[1] = inv[1] = 1;
for(int i = 1, x; i <= n; i++) cmax(mx, x = read()), ans -= x, b[x] += x;
for(int i = 2; i <= mx; i++) {
inv[i] = mod - mod / i * inv[mod % i] % mod;
if(!vis[i]) pr[++cnt] = i, f[i] = 1 - i;
for(int j = 1; j <= cnt && i * pr[j] <= mx; j++) {
int k = i * pr[j]; vis[k] = 1;
if(i % pr[j] == 0) {f[k] = f[i]; break;}
f[k] = f[i] * f[pr[j]];
}
} for(int i = 1; i <= cnt; i++) for(int j = mx / pr[i]; j; j--) b[j] += b[j * pr[i]];
for(int i = 1; i <= mx; i++) b[i] %= mod, ans += b[i] * b[i] % mod * f[i] % mod * inv[i] % mod;
cout << (ans % mod + mod) % mod * inv[2] % mod << endl;
return 0;
}


#### X. P6156 简单题

\begin{aligned} &\ \sum_{i=1}^n\sum_{j=1}^n(i+j)^k\sum_{d=1}^n\mu^2(d)d[\gcd(i,j)=d]\\ =&\ \sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac n d}(i+j)^k[\gcd(i,j)=1]\\ =&\ \sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{o=1}^\frac{n}{d}\mu(o)o^k\sum_{i}^{\frac n {do}}\sum_{j}^{\frac n {do}}(i+j)^k\\ =&\ \sum_{T=1}^nF\left(\dfrac n T\right)\sum_{d\mid T}\mu^2(d)d^{k+1}\mu\left(\dfrac T d\right)\left(\dfrac T d\right)^k\\ =&\ \sum_{T=1}^nF\left(\dfrac n T\right)T^k\sum_{d\mid T}\mu^2(d)d\mu\left(\dfrac T d\right) \end{aligned}

ll k;
int low[N], kp[N], F[N >> 1], G[N];
int n, cnt, ans, pr[N / 15];
bitset <N> vis;
int main(){
cin >> n >> k, k %= mod - 1, kp[1] = 1, G[1] = 1;
for(int i = 2; i <= n << 1; i++) {
if(!vis[i]) kp[i] = ksm(i, k), pr[++cnt] = low[i] = i, G[i] = i - 1;
for(int j = 1; j <= cnt && i * pr[j] <= n << 1; j++) {
int c = i * pr[j]; vis[c] = 1, kp[c] = 1ll * kp[i] * kp[pr[j]] % mod;
if(i % pr[j] == 0) {
low[c] = low[i] * pr[j];
if(i == low[i]) G[c] = i == pr[j] ? mod - pr[j] : 0;
else G[c] = 1ll * G[i / low[i]] * G[low[c]] % mod; break;
} low[c] = pr[j], G[c] = 1ll * G[i] * G[pr[j]] % mod;
}
} for(int i = 2; i <= n; i++) G[i] = (G[i - 1] + 1ll * G[i] * kp[i]) % mod;
for(int i = 1; i <= n << 1; i++) kp[i] = (kp[i - 1] + kp[i]) % mod;
for(int i = 1, j = 2; i <= n; i++, j += 2) F[i] = (F[i - 1] + 2ll * (kp[j] - kp[i] + mod) - (kp[j] - kp[j - 1]) + mod) % mod;
for(int l = 1, r; l <= n; l = r + 1) r = n / (n / l), ans = (ans + 1ll * F[n / l] * (G[r] - G[l - 1] + mod)) % mod;
cout << ans << endl;
return 0;
}


## 6. 高级筛法

### 6.1. 线性筛积性函数

for(int i = 2; i < N; i++) {
if(!vis[i]) pr[++cnt] = i;
for(int j = 1; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) break; // i * pr[j] 最小质因子 pr[j] 次数 > 1
// i * pr[j] 最小质因子 pr[j] 次数 = 1
}
}


for(int i = 2; i < N; i++) {
if(!vis[i]) pr[++cnt] = i, f[i] = ..., low[i] = i;
for(int j = 1; j <= cnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) { // 此时 i 与 pr 不互质, 需要另辟蹊径
low[i * pr[j]] = low[i] * pr[j];
if(i == low[i]) f[i * pr[j]] = ...; // 根据 f(p ^ k) 算 f(p ^ (k + 1))
else f[i * pr[j]] = f[i / low[i]] * f[low[i * pr[j]]]; break;
} f[i * pr[j]] = f[i] * f[pr[j]], low[i * pr[j]] = pr[j]
// i * pr 最小质因子次数 = 1, 可以通过 f[i] * f[pr] 算 f[i * pr] (积性函数的性质)
}
}

posted @ 2021-08-15 17:39  qAlex_Weiq  阅读(901)  评论(0编辑  收藏  举报