奇妙反演

update:

  • 2024.12.11 重新整理了 二项式反演

1. 反演的定义

反演就是从 \(g\) 表示 \(f\) 变为从 \(f\) 表示 \(g\)

当已知 \(f(n) = \displaystyle\sum_{i=1}^{n} {c_{n,i}}g(i)\) 时。若可以推出 \(g(n) = \displaystyle\sum_{i=1}^{n} {d_{n,i}}f(i)\) 时,可以由 \(f\) 推出 \(g\)

则称这两式互为反演公式。

利用反演的本质是由于其反演后的 \(f(n)\) 较容易得到,进而反演出 \(g(n)\)

2. 二项式反演

2.1 概念

从容斥原理开始。
我们假设全集 \(U = \{S_1,S_2,...,S_{n-1},S_n\}\) 中任意 \(i\) 个元素的交集,并集都相等

我们设 \(g(x)\) 是任意 \(x\) 个元素的交集\(f(x)\) 是任意 \(x\) 个元素补集的交集

普通容斥原理就是

\[|S_1\cup S_2\cup ...\cup S_{n-1}\cup S_n| = |S_1| + |S_2| + ... + (-1)^n * |S_1\cap S_2\cap ...\cap S_{n-1}\cap S_n| \]

我们设 \(|S_i|\) 的补集为 \(|\overline{S_i}|\)。则

\[| S_1\cup S_2\cup ...\cup S_{n-1}\cup S_n| = |U| - |\overline{S_1}\cap \overline{S_2}\cap ...\cap\overline{ S_{n-1}}\cap \overline{S_n}| \]

代换到容斥式子里去就是

\[|\overline{S_1}\cap \overline{S_2}\cap ...\cap\overline{ S_{n-1}}\cap \overline{S_n}| = |U| - |S_1| + |S_2| + ... + (-1)^n * |S_1\cap S_2\cap ...\cap S_{n-1}\cap S_n| \]

类似的

\[|S_1\cap S_2\cap ...\cap S_{n-1}\cap S_n| = |U| - |\overline{S_1}| + |\overline{S_2}| + ... + (-1)^n * |\overline{S_1}\cap \overline{S_2}\cap ...\cap \overline{S_{n-1}}\cap \overline{S_n}| \]

我们把 \(f(0)\)\(g(0)\) 设为 \(|U|\)。则

\[f(n) = |S_1\cap S_2\cap ...\cap S_{n-1}\cap S_n| = |U| - |\overline{S_1}| + |\overline{S_2}| + ... + (-1)^n * |\overline{S_1}\cap \overline{S_2}\cap ...\cap \overline{S_{n-1}}\cap \overline{S_n}| = \sum_{i=0}^{n} (-1)^i\dbinom{n}{i}g(i) \]

\[g(n) = |U| - |S_1| + |S_2| + ... + (-1)^n * |S_1\cap S_2\cap ...\cap S_{n-1}\cap S_n| = \sum_{i=0}^{n} (-1)^i\dbinom{n}{i}f(i) \]

我们就得到了优美的初始二项式反演式子:

\[f(n) = \sum_{i=0}^{n} (-1)^i\dbinom{n}{i}g(i) \Leftrightarrow g(n) = \sum_{i=0}^{n} (-1)^i\dbinom{n}{i}f(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) \]

再变一下:

\[f(n) = \sum_{i=m}^{n} \dbinom{n}{i}g(i) \Leftrightarrow g(n) = \sum_{i=m}^{n} (-1)^{n-i} \dbinom{n}{i}f(i) \]

最后可以得到最常用的式子:

\[f(n) = \sum_{i=n}^m \dbinom{i}{n}g(i) \Leftrightarrow g(n) = \sum_{i=n}^m (-1)^{i-n} \dbinom{i}{n}f(i) \]

证明:将右式代入左式得:

\[\begin{aligned} f(n) &= \sum_{i=n}^m \dbinom{i}{n}\sum_{j=i}^{m}(-1)^{j - i} \dbinom{j}{i}f(j) \\ &= \sum_{i=n}^m\sum_{j=i}^{m}f(j)(-1)^{j - i} \dbinom{j}{i}\dbinom{i}{n} \\ &= \sum_{j=n}^{m}f(j)\sum_{i=n}^j(-1)^{j - i} \dbinom{j}{n}\dbinom{j - n}{j - i}\\ &= \sum_{j=n}^{m}\dbinom{j}{n}f(j)\sum_{i=n}^j(-1)^{j - i}\dbinom{j - n}{i - n} \\ &= \sum_{j=n}^{m}\dbinom{j}{n}f(j)\sum_{i=0}^{j-n}(-1)^{j - n + i}\dbinom{j - n}{i} \\ &= \sum_{j=n}^{m}\dbinom{j}{n}f(j)(-1)^{j-n}\ \boxed{\sum_{i=0}^{j-n}(-1)^i\dbinom{j - n}{i}} \\ &= \sum_{j=n}^{m}\dbinom{j}{n}f(j)(-1)^{j-n}\ \boxed{(1 - 1)^{j - n}} \\ &= \sum_{j=n}^{m}\dbinom{j}{n}f(j)(-1)^{j-n}[j = n] \\ &= \dbinom{n}{n}(-1)^0f(n) \\ &= f(n) \\ \end{aligned}\]

利用二项式定理证明,这也是其名字的由来,得证。

2.2 应用与扩展

一般来说,我们将 \(f(n)\) 表示钦定\(n\) 个,\(g(n)\) 表示恰好选定 \(n\) 个,则对于 \(i\geq n\) 都有 \(\dbinom{i}{n}\) 的贡献,即:

\[f(n) = \displaystyle\sum_{i=n}^{m}\dbinom{i}{n}g(i) \]

运用这个式子我们可以反演出 \(g(n)\) 的表达式,从而求出答案。

例题:P10596 BZOJ2839 集合计数

\(f(n)\) 表示钦定\(n\) 个的方案数,则有 \(f(i) = \dbinom{n}{i}(2^{2^{n - i}} - 1)\),钦定后所有包含 \(i\) 个元素的集合有 \(2^{n - i}\) 个。

答案就是 \(g(n)\) 表示恰好选定 \(n\) 个的方案数,有 \(g(n) = \displaystyle\sum_{i=n}^m (-1)^{i-n}\dbinom{i}{n}f(i)\)

复杂度 \(\mathcal{O}(n\log{V} + k\log{V})\)

代码

2.2.1 多维二项式反演

形如 \(f(n,m) = \displaystyle\sum_{i=n}^x\displaystyle\sum_{j=m}^y\dbinom{i}{n}\dbinom{j}{m}g(i,j) \Leftrightarrow g(n,m) = \displaystyle\sum_{i=n}^x(-1)^{i-n}\dbinom{i}{n}\displaystyle\sum_{j=m}^y(-1)^{j-m}\dbinom{j}{m}f(i,j)\)

2.3 例题

I P4859 已经没有什么好害怕的了

首先有若 \(2 \nmid n - k\),则一定无解,否则有 \(\frac{n + k} 2\)\(a_i > b_i\),考虑将问题转化为钦定 \(k\) 组。

考虑 DP,先排个序,设 \(f_{i,j}\) 表示前 \(i\) 组,钦定\(j\)\(a_i > b_i\) 的方案数,有转移:

\(f_{i,j} = f_{i-1,j} + f_{i-1,j-1} \times x\),其中 \(x\) 表示 \(b\)\(\leq a_i\) 的数的个数。

\(F(i)\) 表示钦定 \(n\) 组中钦定 \(i\)\(a > b\) 的方案数,则有 \(F(i) = f_{n,i} \times (n - i)!\)

反演下,得到 \(G(n) = \displaystyle\sum_{i=n}^m (-1)^{i-n}\dbinom{i}{n}F(i)\),答案即为 \(G(\frac {n + k} 2)\)

复杂度 \(\mathcal{O}(n^2)\)

代码

II [ABC266G] Yet Another RGB Sequence

我们设 \(f(n)\)钦定 \(n\)rg 的方案数,有 \(f(n) = \dbinom{R + G + B - n}{n}\dbinom{R + G + B - 2n}{R - n}\dbinom{G + B - n}{G - n}\)

然后反演即可,复杂度 \(\mathcal{O}(n)\)

代码

III P6076 [JSOI2015] 染色问题

三个限制,每个限制单独看都很能反演,考虑多维二项式反演。

\(f(n,m,k)\) 表示钦定 \(n\) 行不染色,\(m\) 列不染色,\(k\) 种颜色不选,则有 \(f(i,j,k) = (c - k + 1)^{(n - i)(m - j)}\dbinom{n}{i}\dbinom{m}{j}\dbinom{c}{k}\)

反演下,得到

\[g(n,m,k) = \sum_{i=n}^x\sum_{j=m}^y\sum_{l=k}^z(-1)^{(i-n)+(j-m)+(l-k)} \dbinom{i}{n}\dbinom{j}{m}\dbinom{l}{k} f(i,j,l) \]

我们要求的答案即为:

\[\begin{aligned} g(0,0,0) &= \sum_{j=0}^y\sum_{l=0}^z(-1)^{j+l}\dbinom{c}{l}\dbinom{m}{j}\boxed{\sum_{i=0}^x\dbinom{n}{i}(-1)^{i}(c - l + 1)^{(n - i)(m - j)}}\\ &= \sum_{j=0}^y\sum_{l=0}^z(-1)^{j+l}\dbinom{c}{l}\dbinom{m}{j}[(c - l + 1)^{m - j} - 1]^n \\ \end{aligned} \]

复杂度 \(\mathcal{O}(nm\log{V})\)

代码

IV P6478 [NOI Online #2 提高组] 游戏

恰好不是很好求,转为求钦定非平局回合数为 \(k\) 的方案数,可以树形 DP \(\mathcal{O}(n^2)\) 求。

具体的,设 \(f_{i,j}\) 表示在 \(i\) 这棵子树内钦定非平局回合数为 \(j\) 的方案数。

对于 \(x\),若 \(x\) 不造成贡献,可以直接背包,否则设 \(c_{x,0/1}\) 表示 \(x\) 子树内 0/1 的节点个数,有:\(f_{i,j} = f_{i,j-1} \times (c_{x,a_x \bigoplus 1} - j + 1)\)

Trick,树形背包 \(\mathcal{O}(n^2)\) 写法: \(\max(1,i - siz_x) - \min(i,siz_y)\)

对于每个询问,直接反演即可,复杂度 \(\mathcal{O}(n^2)\)

代码

V CF1228E Another Filling the Grid

裸的,可以做到 \(\mathcal{O}(n\log{V})\)

VI P10597 BZOJ4665 小 w 的喜糖

刚开始看错题了,难甭

首先,正面不是很好做,考虑有 \(k\) 个人与原来的种类数相同

\(f(n)\) 表示钦定 \(k\) 与原来相同的方案数,这样答案就为 \(g(0) = \displaystyle\sum_{i=0}^n(-1)^ig(i)\)

考虑如何求 \(f\),设 \(f_{i,j}\) 表示前 \(i\) 种糖钦定\(j\) 个人与原来相同,对于每一种颜色,我们枚举该颜色与原来相同的人数 \(k\),有:

\[f_{i,j} = \displaystyle\sum_{k=0}^{\min(c_i,j)}f_{i,j - k}\dbinom{c_i}{k}\dbinom{s - k}{c_i - k} \]

其中 \(s\) 表示前 \(i\)\(c_i\) 的和,总复杂度 \(\mathcal{O}(n^2)\)

代码

VII CF997C Sky Full of Stars

正着做比较难,考虑总数减去 恰好没有一行或一列是同一种颜色 的方案数。

\(f(i,j)\) 表示钦定 \(i\)\(j\) 列是同一种颜色,其他随意选的方案数,有:

\[f(i,j) = \begin{cases} 3^{i + j} \times 3^{(n - i)(n - j)}\dbinom{n}{i}\dbinom{n}{j} &{i = 0 \lor j = 0} \\ 3 \times 3^{(n - i)(n - j)}\dbinom{n}{i}\dbinom{n}{j} &{\mathrm{other}} \\ \end{cases}\]

反演下我们要的是 \(g(0,0) = \displaystyle\sum_{i=0}^n(-1)^i\ \boxed{\displaystyle\sum_{j=0}^n(-1)^jf(i,j)}\),框里的式子先将 \(\dbinom{n}{i}\) 提出来,得到:

\[\begin{aligned} &= \boxed{\sum_{j=0}^n\dbinom{n}{j}(-1)^j 3\times3^{(n-i)(n-j)}} - 3^{1 + n(n-i)} + 3^{i + n(n-i)} \\ &= 3 \times \left(3^{n - i} - 1\right)^n - 3^{1 + n(n-i)} + 3^{i + n(n-i)} \end{aligned}\]

\(i = 0\) 的单独算,最后即 \(3^{n^2} - ans\),总复杂度 \(\mathcal{O}(n\log{V})\)

代码

2.4 参考文章

二项式反演及其应用 - GXZlegend

反演与狄利克雷卷积 - Alex_wei

容斥与反演技巧(一)- 云浅知处

3. 莫比乌斯反演

3.4 杜教筛

4.1 杜教筛算法

一个求积性函数前缀和的优化方法 \(O(n^{\frac{2}{3}})\)

建议先学前面的反演知识。

杜教筛的式子是很自然的推法,首先我们假设要求 \(f(n)\) 的前缀和(一般求前缀和是为了用于整除分块),我们需要找到另一个积性函数 \(g\),使得 \(g\)\((f \ast g)\) 的前缀和都很好求(例如 \(I\)\(id\)),我们设 \(S(n) = \sum_{i=1}^{n} f(i)\)

\[\begin{aligned}\sum_{i=1}^{n} (f \ast g)(i) & = \sum_{i=1}^{n} \sum_{xy=i} g(x) \times f(y)\\ & = \sum_{i=1}^{n} \sum_{j=1}^{\lfloor \frac{n}{i}\rfloor} g(i) \times f(j)\\ & = \sum_{i=1}^{n} g(i) \sum_{j=1}^{\lfloor \frac{n}{i}\rfloor} f(j)\\ & = \sum_{i=1}^{n} g(i)S(\lfloor\frac{n}{i}\rfloor)\\ & = g(1)S(n) + \sum_{i=2}^{n} g(i)S(\lfloor\frac{n}{i}\rfloor)\\ \end{aligned}\]

移一下项得:

\[g(1)S(n) = \sum_{i=1}^{n} (f \ast g)(i) - \sum_{i=2}^{n} g(i)S(\lfloor\frac{n}{i}\rfloor) \]

右边可以整除分块,直接求时间复杂度 \(O(n^{\frac{3}{4}})\)

可以先预处理前 \(n^{\frac{2}{3}}\),再进行杜教筛,时间复杂度 \(O(n^{\frac{2}{3}})\)

证明:不会微积分,看不懂证明

4.2 小推柿子

  • \(\mu \cdot id^k,\varphi \cdot id^k\)

直接卷上 \(id^k\):
\((\mu \cdot id^k) \ast id^k = (\mu \cdot id^k) \ast (I \ast id^k) = (\mu \ast I) \cdot id^k = \epsilon\)

\((\varphi \cdot id^k) \ast id^k = (\varphi \cdot id^k) \ast (I \ast id^k) = (\varphi \ast I) \cdot id^k = id^{k+1}\)

  • \(\mu^2 \ast (\mu \cdot id)\)

卷上 \(id\)
\(\mu^2 \ast (\mu \cdot id) \ast id = \mu^2 \ast \epsilon = \mu^2\)

\(\mu^2\) 是好求的。

  • \(\sigma^k\)

由定义得: \(\sigma^k = \sum_{d|n} id^k = I \ast id^k\)

我们正着用杜教筛公式:

\(\sigma^k = I \ast id^k = \sum\limits_{i=1}^n i^k S(\left\lfloor\frac n i\right\rfloor) = \sum\limits_{i=1}^n i^k\left\lfloor\frac n i\right\rfloor\)

4.3 例题

I P4213 【模板】杜教筛

\(\mu\)\(\varphi\) 的前缀和。

我们知道 \(\mu \ast I = \epsilon\),设 \(S(n) = \sum_{i=1}^{n} \mu(i)\)

直接运用杜教筛公式得

\[\begin{aligned} S(n) & = \sum_{i=1}^{n} \epsilon(i) - \sum_{i=2}^{n} 1 \times S(\lfloor\frac{n}{i}\rfloor)\\ & = 1 - \sum_{i=2}^{n} S(\lfloor\frac{n}{i}\rfloor)\\ \end{aligned}\]

我们又知道 \(\varphi \ast I = id\),设 \(S(n) = \sum_{i=1}^{n} \varphi(i)\)

直接运用杜教筛公式得

\[\begin{aligned} S(n) & = \sum_{i=1}^{n} i - \sum_{i=2}^{n} 1 \times S(\lfloor\frac{n}{i}\rfloor)\\ & = \frac{n(n+1)}{2} - \sum_{i=2}^{n} S(\lfloor\frac{n}{i}\rfloor)\\ \end{aligned}\]

预处理一下,用 \(map\)\(unordered\) 记忆化即可。

代码

II [cogs] 3352. 平方前缀和

\(\sum_{i=1}^{n} \varphi(i^2)\)

基本上是裸的杜教筛

一个关于 \(\varphi\) 的性质:$$\varphi(ij) = \frac{\varphi(i)\varphi(j)gcd(i,j)}{\varphi(gcd(i,j))}$$

证明:该式本质上是容斥,\(\varphi\) 的原式子是,当 \(n = {p_1}^{c_1}\times {p_2}^{c_2} \times ··· \times {p_m}^{c_k}\)

\(\varphi(n) = n \times \prod_{i=1}^{m} (1 - \frac{1}{p_i})\)

这里式子就表示为先把 \(i\)\(j\) 的质因数乘上在除去 \(i,j\)共同质因数,即 \(\varphi(gcd(i,j))\),最后再消掉 \(gcd(i,j)\) 即可得到该式。

然后开始推式子:

\[\sum_{i=1}^{n} \varphi(i^2) = \sum_{i=1}^{n} i \times \varphi(i) \]

不难发现该式等于 \(\varphi \cdot id\)

\[(\varphi \cdot id) \ast id = \sum_{d\mid n} d * \varphi(d) * \frac{n}{d} = n \times \sum_{d\mid n} \varphi(d) = id^2 \]

我们设 \(f(n) = n \times \varphi,S(n) = \sum_{i=1}^{n} f(i)\)

运用杜教筛公式可得:

\[S(n) = \sum_{i=1}^{n}i^2 - \sum_{i=2}^{n} i * S(\lfloor\frac n i\rfloor) \]

\[= \frac{n(n+1)(2n+1)}{6} - \sum_{i=2}^{n} i * S(\lfloor\frac n i\rfloor) \]

线性筛出前 \(n^{\frac{2}{3}}\) 项,整除分块即可

III P3768 简单的数学题

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

类似这样直接加上 \(gcd(i,j)\) 的式子用欧拉反演会更容易些。

\[\begin{aligned}\sum_{i=1}^{n}\sum_{j=1}^{n} ij \times gcd(i,j) & = \sum_{i=1}^{n}\sum_{j=1}^{n} ij \times \sum_{d\mid gcd(i,j)} \varphi(d)\\ & = \sum_{d=1}^{n}\varphi(d)d^2 \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} i \times \sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}j\\ & = \sum_{d=1}^{n}\varphi(d)d^2 (\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} i)^2\\ & = \sum_{d=1}^{n}\varphi(d)d^2 \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} i^3\\ \end{aligned}\]

显然可以整除分块,数据范围很大,需要杜教筛。

  • 只需考虑 \(f(n) = \sum_{d=1}^{n}\varphi(d)d^2\)\(f = \varphi \cdot id^2\)
    这里的 \(id^2\) 很烦,考虑把它消去,只需卷积一个 \(id^2\) 即可。
    证明:\((\varphi \cdot id^2) \ast id^2 = \sum_{d\mid n} \varphi(d)d^2(\frac{n}{d})^2 = n^2\sum_{d\mid n}\varphi(d) = n^3 = id^3\),证毕。
    推广一下:\((\varphi \cdot id^k) \ast id^k = id^{k+1}\),直接用即可。

所以 \(f \ast id^2 = id^3\),设 \(S(n) = \sum_{i=1}^{n}f(i)\)

则运用杜教筛公式得:

\[\begin{aligned}S(n) & = \sum_{i=1}^n i^3 - \sum_{i=2}^n i^2 S(\lfloor\frac{n}{i}\rfloor)\\ & = (\frac{n(n+1)}{2})^2 - \sum_{i=2}^n i^2 S(\lfloor\frac{n}{i}\rfloor)\\ \end{aligned}\]

整除分块即可,注意取模求逆元。

代码

posted @ 2024-04-06 21:40  oXUo  阅读(17)  评论(0编辑  收藏  举报
网站统计