计数理论杂谈 I:线性变换,各种卷积,反演

· · 个人记录

作为计数理论杂谈的第一篇文章,我决定明确一下计数领域的一些(较为容易的)技能点,于是我就准备讲一讲卷积(FFT,FWT)与反演,为了使更为容易的对卷积的复杂度优化有一个大体的认识,我们也会讲线性变换的概念。

你发现有很多技能点未在此文章提及,例如插值,生成函数,杨表等,如果有机会的话,之后总会讲的。

注:若无特殊说明,本文的数列都是 0-index 的。

Chapter 1.线性变换

定义

考虑一个函数 f(a),其参数是一个长为 n 的数列,返回值是一个长为 m 的数列,f 可以被当成数列到数列的变换。
若存在 n\times m 的矩阵 e_{i,j},满足 f(a)_i=\sum\limits_{j=0}^{n-1}a_je_{i,j},则 f 被称为线性变换。
容易发现,若把一个数组看成向量,一个线性变换就是将其乘一个矩阵。(众所周知,线性代数第一颗基本都会讲矩阵)
线性变换的“线性”体现在哪?定义数列 a 乘数字 x 等价于将 a 中每一个数乘 x,两个等长数列相加为对位相加,对于线性变换 f,则有 f(xa+yb)=xf(a)+yf(b),显然可以用矩阵的相关性质证明。

一个线性变换 f(a),总可以被拆成 g_k(g_{k-1}(\cdots(g_1(g_0(a))))) 的形式,满足 g_x(a) 只有两种可能:一是删除或插入某一位,二是 a_x:=a_x+ka_y
构造可以先对 f 对应的矩阵补成方阵,然后高斯消元,对消元后的上三角矩阵从后往前构造,再构造高斯消元的逆过程。

常见的线性变换

1.删除某一位/插入某一位
对应的矩阵为单位矩阵删去若干列插入若干列。

2.a_x:=a_x+ka_y
单位矩阵,然后 e_{x,y}:=e_{x,y}+k

3.数列前缀和
对应的矩阵 e_{i,j} 应满足 e_{i,j}=1 当且仅当 i\le j,即这是一个上三角都为 1 的矩阵。

4.数列差分
对应的矩阵 e_{i,j} 满足主对角线都是 1,且 e_{i-1,i}=-1

差分具有线性性质的根本原因就是其实一个线性变换。

几何意义

根据上面的性质,如果我们把一个数列看成 n 维空间上的一个点,一个线性变换会执行若干步,每步只有三种可能:一是在某一维的水平面上投影,二是新加一维,不改变原有点坐标,三是选择某一维,将这一维的坐标轴任意摆放(不需要垂直),任意缩放,重构坐标系上的点(保持坐标不变),复原坐标轴(保持点的位置不变)。
如果这个线性变换满足前后数组长度不变,则对应到空间里就是将空间坐标轴任意摆放缩放,再把点重构,再把坐标轴重构。

线性变换的逆

线性变换 f(a) 的逆 g(a) 满足 f(g(a))=g(f(a))=a,所以若 f(a)g(a) 互为逆,则 g 的返回值的长度等于 f 的参数的长度,f 的返回值的长度等于 g 的参数的长度。
一个线性变换有逆,当且仅当把它拆分成上文所述的形式时,任意的 g_i(a) 都不会是删除、插入某一位或 a_x:=a_x+(-a_x)
一个线性变换逆的构造可以根据拆分方式构造,同时也可以构造其矩阵对应的逆矩阵。

Chapter 2.卷积

定义

对于数列 a,b,定义他们的卷积 c_k=\sum\limits_{i\ \text{op}\ j=k}a_ib_j,其中 \text{op} 为一种运算。
不难发现,若 a,b 长度都为 n,计算卷积的时间复杂度为 O(n^2)
下文中,我们将会从易到难讲解如何优化卷积。
以下设 c_i 只用保留前 n 项。

基本思路

一些学过 FFT,FWT 的人很容易想出这一点,优化卷积的基本思路就是构造一个线性变换 f,满足 f(a\times b)=f(a)\cdot f(b),其中 (a\cdot b)_i=a_ib_i,此时只要这个线性变换的性质足够良好就能做到更低的复杂度。

狄利克雷卷积

当我们取 \text{op}=\times,即 c_i=\sum\limits_{jk=i}a_jb_k 时,我们称其为狄利克雷卷积(Dirichlet convolution)。
一般,狄利克雷卷积的数列是 1-index 的。
容易发现,当我们先枚举 j,再枚举 k\le \frac nj,此时复杂度为 O(\sum\limits_{i=1}^n \frac ni)=O(n\log n),不必优化。
b_i=1 时,c_i=\sum\limits_{j|i}a_j,令 f(a)=c,则 f 被称为狄利克雷前缀和。
狄利克雷前缀和的逆我们将在第三章讲解。

和卷积

当我们取 \text{op}=+,即 c_i=\sum\limits_{j=0}^i a_jb_{i-j} 时,c 被称作 ab 的和卷积。
考虑构造线性变换的矩阵 e
我们应满足 f(c)_i=f(a)_if(b)_i,即 \sum\limits_{j=0}^{n-1} c_je_{j,i}=(\sum\limits_{j=0}^{n-1}a_je_{j,i})(\sum\limits_{j=0}^{n-1}b_je_{j,i})
代入 c_i=\sum\limits_{j=0}^i a_jb_{i-j},得 \sum\limits_{j=0}^{n-1} \sum\limits_{k=0}^j a_kb_{j-k}e_{j,i}=\sum\limits_{j=0}^{n-1}\sum\limits_{k=0}^{n-1}a_jb_ke_{j,i}e_{k,i}
比较 a_jb_k 的系数,得 e_{j+k,i}=e_{j,i}e_{k,i}
显然(?),若 a_i\neq 0,\forall i\neq j,a_i\neq a_je_{i,j}=(a_j)^i 是合法的。
若取 a_j=j+1,则这个线性变换还是只能 O(n^2) 求。
n\le m=2^k,注意到取 a_j=\omega_m^j 是合法的。\omega_kk 次单位根。
此时,注意到,e 的左右两边很像,e_{i,j+\frac m2}=(-1)^ie_{i,j}
这启发我们将行按奇偶拆开,将列按左右拆开,此时只用管左边的列。
按行拆后形如 \sum\limits_{j=0}^{\frac m2-1} b_j\omega_m^{i(2j+1)}=\omega_m^i\sum\limits_{j=0}^{\frac m2-1}b_j\omega_m^{2ij}=\omega_m^i\sum\limits_{j=0}^{\frac m2-1}b_j\omega_{\frac m2}^{ij}
发现这个等价于原问题,分治即可。
时间复杂度 O(n\log n)
哦不对,我还要求这个矩阵的逆。
众所周知,满足 e_{i,j}=(a_j)^i 的矩阵叫范德蒙德矩阵。
然后我们取的这个范德蒙德矩阵非常特殊,其逆矩阵为原矩阵每个数取倒数再除以 m
然后这个逆矩阵显然也是范德蒙德矩阵,也有左右相反的性质,所以可以再做一遍。
这个线性变换 f 叫 DFT(Discrete Fourier Transform),其逆变换 f^{-1} 叫 IDFT(Inverse Discrete Fourier Transform)。
这样你就会 FFT(Fast Fourier Transform) 啦!
哦还有, \omega_k 显然是一个复数,但当 k\mid mod-1 时,取 \omega_k=g^{\frac{mod-1}{k}} 性质良好。
这样你就会 NTT(Number-Theoretic Transform) 啦!
例题:P3803。

差卷积

\text{op}=-,即 c_i=\sum\limits_{j=0}^{n-1} a_{j+i}b_{j} 时,c 被称作 ab 的差卷积。
容易发现,若我们令 b'_i=b_{n-1-i},则 c_i=\sum\limits_{j=0}^{n-1} a_{j+i}b'_{n-1-j},为 ab' 和卷积 a\times b' 的第 n+i-1 项。
时间复杂度 O(n\log n)
例题:P3338。

与卷积

\text{op}=\And,即 c_i=\sum\limits_{j\And k=i}a_jb_k 时,我们称 cab 的与卷积。
类似和卷积的推导过程,我们构造的 e 应满足 e_{j\And k,i}=e_{j,i}e_{k,i}
我们构造 e_{i,j}=[j\subseteq i]=[i\And j=j],容易发现符合性质。
问题变成了求 b_j=\sum\limits_{j\subseteq i} a_i,即超集和。
高维后缀和即可,时间复杂度 O(n\log n)

或卷积

\text{op}=|,即 c_i=\sum\limits_{j|k=i}a_jb_k 时,我们称 cab 的或卷积。
显然,我们构造的 e 应满足 e_{j|k,i}=e_{j,i}e_{k,i}
构造 e_{i,j}=[i\subseteq j]=[i\And j=i]
问题变成了求 b_j=\sum\limits_{i\subseteq j} a_i,即子集和。
高维前缀和即可,时间复杂度 O(n\log n)
逆变换显然。

异或卷积

\text{op}=\oplus,即 c_i=\sum\limits_{j\oplus k=i} a_jb_k
同理,我们构造的 e 应满足 e_{j\oplus k,i}=e_{j,i}e_{k,i}
这个构造怎么推的我仔细讲一下。
注意到 e_{i,x}=(-1)^{popcnt(i)} 是一种合法的列,因为有 popcnt(x\oplus y)\equiv popcnt(x)+popcnt(y)\pmod 2
发现 popcnt((x\oplus y)\And k)=popcnt((x\And k)\oplus(y\And k))\equiv popcnt(x\And k)+popcnt(y\And k)\pmod 2
所以我们可以构造 e_{i,j}=(-1)^{popcnt(i\And j)}
我们现在要求 b_j=\sum\limits_{i=0}^{n-1} (-1)^{popcnt(i\And j)} a_i
n=2^k,考虑分治。
先将前 2^{k-1} 个数和后 2^{k-1} 个数分别变换为对应的 b,然后考虑他们之间的贡献。
对于 a_ia_{i+2^{k-1}},我们让 a_i:=a_i+a_{i+2^{k-1}},a_{i+2^{k-1}}:=a_i-a_{i+2^{k-1}},原因显然。
对于逆变换,同理,自行推导。
这个东西和高维前缀和放一块,叫 FWT。
时间复杂度 O(n\log n)
例题:P4717,P6097。

Chapter 3.反演

定义

反演,可以认为是反向演化,即对于一些常用的线性变换构造逆的过程。
通常这些过程需要伴随着加减,所以作者在介绍反演套路时会带上一些容斥套路(或者说反演和容斥本身就难以分清)。
Limie 表示反演是容斥的高级叫法及扩展,作者认为反演是容斥的理性说明。

差分

对于两长度为 n 的数组 f,g,有以下两个结论:

证明是显然的。
差分一般用于解决“最值恰好为 n 的方案数”的问题(这需要和 min-max 反演区分),以最大值为例,我们定义 g_i 为“最小值恰好为 i”的方案数,f_i=\sum\limits_{j=i}^{n-1} g_j,则 f_i 为“所有元素都 \ge i”的方案数(\ge i 需要和二项式反演中的“钦定……一定”区分)。
有的时候,f 反而是好求的(更为独立),此时只需求 f_i,f_{i+1} 两个单点的值即可求出 g_i

子集反演

对于两个定义域为 \{0,1,\cdots,n-1\} 的,值域为数字的函数 f,g,有以下两结论:

第一个结论证明:
注意到 g\to f 是一个线性变换,所以只需证明结论是正确的,根据逆的唯一性就可得出无其他式子。
起手代入,只需证 f(S)=\sum\limits_{T\subseteq S}\sum\limits_{T'\subseteq T} (-1)^{|T|-|T'|}f(T')

\sum\limits_{T\subseteq S}\sum\limits_{T'\subseteq T} (-1)^{|T|-|T'|}f(T') 注意到非空集合的偶子集数量恰好为一半,空集合恰为 $1$。 原式变为 $\sum\limits_{T'\subseteq S} f(T')[S-T'=\emptyset] 子集反演的用法不算很多,以下列举三种较为经典的。 令 $g(S)$ 为值域恰好为 $S$ 的答案,$f(S)$ 为每个元素都在 $S$ 中的答案。 有 $f(S)=\sum\limits_{T\subseteq S} g(T)$,根据子集反演,$g(S)=\sum\limits_{T\subseteq S} (-1)^{|S|-|T|} f(T)$。 一般 $f(S)$ 是较为容易求的,因为此时每个元素是相对更为独立的。 求出所有 $f(T)$,就能求出所有 $g(S)$,但如果只要求一个 $g(S)$,也需要求出 $2^{|S|}$ 个 $f(T)$。 注意到若一个长为 $n$ 的序列的值域恰为 $\{1,2,\cdots,n\}$,则这是一个排列,所以子集反演也是一种排列计数的方法。 例题:P3349,P4336。 当需要求 $\sum\limits_{T_1}\sum\limits_{T_2} f(T_1\cap T_2)$($f$ 可以是一些很抽象的函数)时,直接求比较困难。 构造 $g(S)=\sum\limits_{T\subseteq S} (-1)^{|S|-|T|} f(T)$,有 $f(S)=\sum\limits_{T\subseteq S} g(T)$。 原式可以化为 $\sum\limits_{T_1}\sum\limits_{T_2}\sum\limits_{S\subseteq T_1,S\subseteq T_2} g(S)$。 枚举 $S$,就可以使 $T_1,T_2$ 具有更大的独立性,有利于解决问题。 例题:P5206。 当有 $n$ 个条件需要满足,且条件不满足的情况更好处理时,可以令 $g(S)$ 为满足条件的集合恰为 $S$ 的方案数,$f(S)$ 为只有 $S$ 中的条件可能合法的方案数(即补集中一定不合法),则 $f(S)=\sum\limits_{T\subseteq S} g(T)$,子集反演,$g(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-|S|}f(T)$,而求出 $g4f(T)$ 相当于限制条件不满足,更好处理。 若 $f(T)$ 本身需要使用 dp 求解时,可以尝试把容斥的系数放入 dp 转移,有概率将 $2^n$ 枚举的过程省去(,这是一条经典的出题道路,可以通过此方法出一些困难容斥题)。 例题:P5405。 ### 二项式反演 对于两长度为 $n$ 的数组 $f,g$,有以下两个结论: - $f_i=\sum\limits_{j=0}^i \binom ijg_j\Leftrightarrow g_i=\sum\limits_{j=0}^{i} (-1)^{i-j} \binom ijf_j

证明形似于子集反演,读者自证不难,给两个式子:

  1. \binom ab\binom bc=\binom ac\binom{a-c}{b-c}
  2. \sum\limits_{i=0}^n \binom ni x^iy^{n-i}=(x+y)^n

虽然但是,若子集反演中 f(S) 只于 |S| 有关,即可写为二项式反演。

二项式反演最重要的在于其用法,重点在于第二个式子:

使用二项式反演的题一般都是给若干限制,要求满足限制数 恰好x,令 g_i恰好 满足 i 个条件的方案数,f_i钦定 i 个条件一定满足的方案数,则 f,g 满足上二式。

lengendcn:啊什么?钦定大于等于 不是一样的吗,所以这个不是应该套差分的式子吗?
这是非常容易混淆的一点,钦定 i 个的意思是,我选择 i 个条件,让他们一定合法,对于所有选择 i 个条件的方案,将合法的方案数相加,得到的总和就是 钦定 i 个合法的方案数。
换句话说,钦定 是有一个选择和故意算重的过程的。
但这个故意算重的过程使 钦定…… 变得更为好算,因为只需 选择 i 个条件合法即可,不用管没被选到的条件,选择的过程大多容易使用 dp 计算。
设实际上有 j 个条件合法,我们 钦定 i 个合法,则这 j 个条件中任意选 i 个的方案的可能都会被计算一次,一共会被计算 \binom ji 次,但 大于等于 只会被计算 1 次,所以 f,g 符合上二式。

使用二项式反演,只需求出 f 就能求 g 的单点,此时也可以尝试将容斥系数丢进 dp。
什么?你想求所有 g,但是只会 O(n^2)
将组合数展开,有 g_i=(-1)^ii!\sum\limits_{j=i}^{n} \frac{(-1)^jf_j}{j!}\frac{1}{(j-i)!},差卷积即可,时间复杂度 O(n\log n)

求求你们不要在题解里把 钦定 写成 大于等于 了!!!就这个问题在 2024 年 3 月让我想了两天。

例题:P4859,P4491。

以上三种反演是最经典的(提高组考了可以解释为“容斥基础”)的容斥方法,其中差分与二项式反演较为容易混淆,当遇到“恰好”等字眼时,应优先考虑二项式反演,当遇到“最值”等字眼时,应优先考虑差分。

莫比乌斯反演

莫比乌斯反演 是 狄利克雷前缀和 的逆,也是把 差分 丢上质因数指数的形式。
一句话描述:\mu*I=\epsilon。(* 是狄利克雷卷积)
又一句话描述:g=f*I \Leftrightarrow f=g*\mu
人话描述:对于两长度为 n 的 1-index 的数组 f,g,有以下两个结论:

什么?你告诉我你不知道什么是 \mu(x)

\exist d>1 使 d^2\mid x,则 \mu(x)=0
否则设 x=\prod\limits_{i=1}^k p_i,则 \mu(x)=(-1)^k

证明:
\mu*I=\epsilon,g=f*I,则 g*\mu=f*I*\mu,则 g*\mu=f,所以只需证 \mu*I=\epsilon
相当于证 \sum\limits_{d|n}\mu(d)=[n=1]
n=\prod\limits_{i=1}^k p_i^{\alpha_i}
因为若 \exist d^2\mid n\mu(n)=0
所以若设 d=\prod\limits_{i=1}^k p_i^{\beta_i},则 \beta_i\in\{0,1\},贡献为 (-1)^{\sum\beta_i}
枚举 \beta_i1i 的集合,则为 \sum\limits_{S\subseteq\{1,2,\cdots,k\}} (-1)^{|S|}
注意到非空集合的奇子集与偶子集构成双射,所以上式 =[k=0]

从另一方面想,在指数上的差分,$\mu(x)$ 一定是个积性函数,且 $\mu(p)=-1,\mu(1)=1$,然后就可以写成如上形式。 莫比乌斯反演经常用在 $[\gcd(i,j)=1]$ 的条件上,使用莫反可以变为 $\sum\limits_{d|i,d|j}\mu(d)$,然后就可以枚举 $d$ 计算。 这边再介绍一个 trick,$\sum f(\gcd(i,j))h(i)h(j)$ 如何计算($h$ 比较简单)。 起手枚举 $g=\gcd(i,j)$,答案为 $\sum\limits_{g=1}^n\sum\limits_{i=1}^{\lfloor\frac ng\rfloor}\sum\limits_{j=1}^{\lfloor\frac mg\rfloor} f(g)h(ig)h(jg)[\gcd(i,j)=1]$。 莫反,然后将 $d$ 丢到前面,变为 $\sum\limits_{g=1}^nf(g)\sum\limits_{d=1}^{\lfloor\frac ng\rfloor}\mu(d)\sum\limits_{i=1}^{\lfloor\frac n{gd}\rfloor}\sum\limits_{j=1}^{\lfloor\frac m{gd}\rfloor} h(igd)h(jgd)

枚举 t=gd,答案为 \sum\limits_{t=1}^n (\sum\limits_{g|t}f(g)\mu(\frac tg))(\sum\limits_{i=1}^{\lfloor\frac nt\rfloor}h(it))(\sum\limits_{i=1}^{\lfloor\frac mt\rfloor}h(it))
第一个括号预处理,后面两个推式子,然后数论分块即可。
例题:AGC038C。

单位根反演

结论:[n\mid k]=\frac 1n\sum\limits_{i=0}^{n-1} \omega_{n}^{ik}

证明:
n\mid k 时,\omega_n^k=1\frac{1}{n}\sum\limits_{i=0}^{n-1}1^i=1
否则,\omega_n^k\neq 1,\frac{1}{n}\sum\limits_{i=0}^{n-1}\omega_n^{ik}=\frac{1-\omega_n^{nk}}{n(1-\omega_n^k)}=\frac{0}{n(1-\omega_n^k)}=0

用法很显然,就是把 [n\mid k] 代入成 \frac 1n\sum\limits_{i=0}^{n-1} \omega_{n}^{ik},然后交换求和顺序即可。
对于一些和 i\mod k 有关的东西,先枚举他 =x,则有 k\mid i-x,展开成为 \frac 1k\sum\limits_{j=0}^{k-1}\omega_k^{j(i-x)},然后通过一些手段解决问题。

min-max 反演

结论:

证明可以归纳。

从式子上可以看出,他主要是求期望最大值的问题。

对于多物体随机过程的期望停时问题,令物体 i 的结束时间为 t_i,则要求 E(\max(t)),可尝试通过 min-max 反演式转化,常与容斥 dp 结合。

以上是一些常用的反演过程,实战中较为常用。

本文大抵到此为止,此为作者学习计数时一篇小记,望对大家产生帮助。

再来一篇:不是,你们都是怎么拥有这么逆天的想法的(计数理论杂谈 II:【数据删除】)。