线性离散反演
线性离散变换都可以表示为矩阵的形式
对于数列 A [ a 0 , a 1 . . . ] A[a_0,a_1...] A[a0,a1...], B [ b 0 , b 1 . . . ] B[b_0,b_1...] B[b0,b1...],矩阵 M M M满足 B = M A B=MA B=MA, A = M − 1 B A=M^{-1}B A=M−1B,则变换 M M M与变换 M − 1 M^{-1} M−1互为反演变换
对 B = M A B=MA B=MA,我们已知 B B B,能否还原 A A A,这就是逆变换的关注点,也称为反演
当施加在数列 A A A上的运算不容易处理时,我们可以利用变换矩阵的性质在 O ( n ) O(n) O(n)或者 O ( n l g n ) O(nlgn) O(nlgn)的时间内转换到数列 B B B,作等价运算完成后再通过逆变换还原回去,这就是 F F T FFT FFT, N T T NTT NTT, F W T FWT FWT的思想,区间修改化差分点值修改也体现了这一思想
同时,如果满足某条件的数列 A A A不容易求出的时候,我们可以先求出某个容易求的 M B MB MB,再反演回来得到结果
前缀和反演
b i = ∑ j = 0 i a j a i = b i − b i − 1 M = [ 1 0 0 0 . . . 1 1 0 0 . . . 1 1 1 0 . . . 1 1 1 1 . . . . . . . . . . . . . . . . . . ] M − 1 = [ 1 0 0 0 . . . − 1 1 0 0 . . . 0 − 1 1 0 . . . 0 0 − 1 1 . . . . . . . . . . . . . . . . . . ] \begin{array}{cc} b_i=\sum_{j=0}^i a_j\ & a_i=b_i-b_{i-1} \\ \\ M=\left[ \begin{matrix} 1 & 0 & 0 & 0 & ... \\ 1 & 1 & 0 & 0 & ... \\ 1 & 1 & 1 & 0 & ... \\ 1 & 1 & 1 & 1 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] & M^{-1}=\left[ \begin{matrix} 1 & 0 & 0 & 0 & ... \\ -1 & 1 & 0 & 0 & ... \\ 0 & -1 & 1 & 0 & ... \\ 0 & 0 & -1 & 1 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] \end{array} bi=∑j=0iaj M=⎣⎢⎢⎢⎢⎡1111...0111...0011...0001..................⎦⎥⎥⎥⎥⎤ai=bi−bi−1M−1=⎣⎢⎢⎢⎢⎡1−100...01−10...001−1...0001..................⎦⎥⎥⎥⎥⎤
证明, M M − 1 = E MM^{-1}=E MM−1=E,考虑 M − 1 M^{-1} M−1第 y y y列中的非零项
M M − 1 x , y = M x , y M − 1 y , y + M x , y + 1 M − 1 y + 1 , y = { 0 x < y 1 x = y 1 − 1 x > y = { 1 x = y 0 x ≠ y ∴ M M − 1 = E \begin{array}{rl} MM^{-1}\ _{x,y} & = M_{x,y}M^{-1}\ _{y,y}+M_{x,y+1}M^{-1}\ _{y+1,y} \\ & = \left\{ \begin{array}{cc} 0 & x
这就是前缀和与差分,很好理解,可以推广到多维(定义域为 { 0 , 1 } \{0,1\} {0,1}时为子集反演,详见下文)
莫比乌斯反演
数论反演,定义域为正整数,这里假定a,b下标都从1开始
b i = ∑ j ∣ i a j a i = ∑ j ∣ i μ ( i j ) b j M = [ 1 0 0 0 0 0 . . . 1 1 0 0 0 0 . . . 1 0 1 0 0 0 . . . 1 1 0 1 0 0 . . . 1 0 0 0 1 0 . . . 1 1 1 0 0 1 . . . . . . . . . . . . . . . . . . . . . . . . ] M − 1 = [ μ ( 1 ) 0 0 0 0 0 . . . μ ( 2 ) μ ( 1 ) 0 0 0 0 . . . μ ( 3 ) 0 μ ( 1 ) 0 0 0 . . . μ ( 4 ) μ ( 2 ) 0 μ ( 1 ) 0 0 . . . μ ( 5 ) 0 0 0 μ ( 1 ) 0 . . . μ ( 6 ) μ ( 3 ) μ ( 2 ) 0 0 μ ( 1 ) . . . . . . . . . . . . . . . . . . . . . . . . ] \begin{array}{cc} b_i=\sum_{j|i} a_j\ & a_i=\sum_{j|i} \mu(\frac i j)b_j \\ \\ M=\left[ \begin{matrix} 1 & 0 & 0 & 0 & 0 & 0 & ... \\ 1 & 1 & 0 & 0 & 0 & 0 & ... \\ 1 & 0 & 1 & 0 & 0 & 0 & ... \\ 1 & 1 & 0 & 1 & 0 & 0 & ... \\ 1 & 0 & 0 & 0 & 1 & 0 & ... \\ 1 & 1 & 1 & 0 & 0 & 1 & ... \\ ... & ... & ... & ... & ... & ... & ... \end{matrix} \right] & M^{-1}=\left[ \begin{matrix} \mu(1) & 0 & 0 & 0 & 0 & 0 & ... \\ \mu(2) & \mu(1) & 0 & 0 & 0 & 0 & ... \\ \mu(3) & 0 & \mu(1) & 0 & 0 & 0 & ... \\ \mu(4) & \mu(2) & 0 & \mu(1) & 0 & 0 & ... \\ \mu(5) & 0 & 0 & 0 & \mu(1) & 0 & ... \\ \mu(6) & \mu(3) & \mu(2) & 0 & 0 & \mu(1) & ... \\ ... & ... & ... & ... & ... & ... & ... \end{matrix} \right] \end{array} bi=∑j∣iaj M=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡111111...010101...001001...000100...000010...000001........................⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤ai=∑j∣iμ(ji)bjM−1=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡μ(1)μ(2)μ(3)μ(4)μ(5)μ(6)...0μ(1)0μ(2)0μ(3)...00μ(1)00μ(2)...000μ(1)00...0000μ(1)0...00000μ(1)........................⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
证明, M M − 1 = E MM^{-1}=E MM−1=E,考虑 M M M第 x x x行与 M − 1 M^{-1} M−1第 y y y列中的第 k k k项,显然第 k k k项非零条件为 [ k ∣ x ] [ k ∣ y ] [k|x][k|y] [k∣x][k∣y]
KaTeX parse error: Undefined control sequence: \and at position 52: …& = \sum_{k|x\ \̲a̲n̲d̲\ k|y}M_{x,k}M^…
莫比乌斯反演本质就是一个容斥的过程,因为和整除密切相关,很多 g c d gcd gcd, l c m lcm lcm,互质的题目都可能会用到
子集反演
集合可以施加,与,交,交补运算,用二进制数表示集合,可转化为数的&,|,^运算
子集和可以用子集枚举 O ( 3 n ) O(3^n) O(3n)或者 S O S D P SOSDP SOSDP,或 F W T _ o r FWT\_or FWT_or正变换或 F M T FMT FMT, O ( n 2 n ) O(n2^n) O(n2n)来解决
子集反演则是子集和的逆变换过程,可以用子集枚举 O ( 3 n ) O(3^n) O(3n)或者逆变换或 F M I FMI FMI, O ( n 2 n ) O(n2^n) O(n2n)解决
这里的 j ∣ i = i j|i=i j∣i=i表示 j j j是 i i i子集, i − j i-j i−j表示指定全集 i i i,对 j j j做补集运算, b i t s _ c n t ( x ) bits\_cnt(x) bits_cnt(x)表示二进制数 x x x为1的位的个数
b i = ∑ j ∣ i = i a j a i = ∑ j ∣ i = i ( − 1 ) b i t s _ c n t ( i − j ) b j M = [ 1 0 0 0 0 0 . . . 1 1 0 0 0 0 . . . 1 0 1 0 0 0 . . . 1 1 1 1 0 0 . . . 1 0 0 0 1 0 . . . 1 1 0 0 1 1 . . . . . . . . . . . . . . . . . . . . . . . . ] M − 1 = [ 1 0 0 0 0 0 . . . − 1 1 0 0 0 0 . . . − 1 0 1 0 0 0 . . . 1 − 1 − 1 1 0 0 . . . − 1 0 0 0 1 0 . . . 1 − 1 0 0 − 1 1 . . . . . . . . . . . . . . . . . . . . . . . . ] \begin{array}{cc} b_i=\sum_{j|i=i} a_j\ & a_i=\sum_{j|i=i} (-1)^{bits\_cnt(i - j)}b_j \\ \\ M=\left[ \begin{matrix} 1 & 0 & 0 & 0 & 0 & 0 & ... \\ 1 & 1 & 0 & 0 & 0 & 0 & ... \\ 1 & 0 & 1 & 0 & 0 & 0 & ... \\ 1 & 1 & 1 & 1 & 0 & 0 & ... \\ 1 & 0 & 0 & 0 & 1 & 0 & ... \\ 1 & 1 & 0 & 0 & 1 & 1 & ... \\ ... & ... & ... & ... & ... & ... & ... \end{matrix} \right] & M^{-1}=\left[ \begin{matrix} 1 & 0 & 0 & 0 & 0 & 0 & ... \\ -1 & 1 & 0 & 0 & 0 & 0 & ... \\ -1 & 0 & 1 & 0 & 0 & 0 & ... \\ 1 & -1 & -1 & 1 & 0 & 0 & ... \\ -1 & 0 & 0 & 0 & 1 & 0 & ... \\ 1 & -1 & 0 & 0 & -1 & 1 & ... \\ ... & ... & ... & ... & ... & ... & ... \end{matrix} \right] \end{array} bi=∑j∣i=iaj M=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡111111...010101...001100...000100...000011...000001........................⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤ai=∑j∣i=i(−1)bits_cnt(i−j)bjM−1=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡1−1−11−11...010−10−1...001−100...000100...00001−1...000001........................⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
如果把每个集合的状态 0 , 1 {0,1} 0,1看做一维,那么子集和的过程也就是多维前缀和的过程,那么只需要一维一维的作前缀,就可以的到子集和,一维一维的作差分,就可以还原数组
这就是经典的快速莫比乌斯变换(FMT)与快速莫比乌斯逆变换FMI
void FMT(int a,int n) {
for(int i = 0;i < n;i ++)
for(int j = 0;j < (1 << n);j ++)
if ( j & (1 << i) ) p[j] += p[j - (1 << i)];
}
void FMI(int a,int n) {
for(int i = 0;i < n;i ++)
for(int j = 0;j < (1 << n);j ++)
if ( j & (1 << i) ) p[j] -= p[j - (1 << i)];
}
二项式反演
b i = ∑ j = 0 i ( i j ) a j a i = ∑ j = 0 i ( − 1 ) i − j ( i j ) b j M = [ 1 0 0 0 . . . 1 1 0 0 . . . 1 2 1 0 . . . 1 3 3 1 . . . . . . . . . . . . . . . . . . ] M − 1 = [ 1 0 0 0 . . . − 1 1 0 0 . . . 1 − 2 1 0 . . . − 1 3 − 3 1 . . . . . . . . . . . . . . . . . . ] \begin{array}{cc} b_i=\sum_{j=0}^i \Big( \begin{array}{c} i \\ j \end{array} \Big) a_j & a_i=\sum_{j=0}^i (-1)^{i-j} \Big( \begin{array}{c} i \\ j \end{array} \Big) b_j \\ \\ M=\left[ \begin{matrix} 1 & 0 & 0 & 0 & ... \\ 1 & 1 & 0 & 0 & ... \\ 1 & 2 & 1 & 0 & ... \\ 1 & 3 & 3 & 1 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] & M^{-1}=\left[ \begin{matrix} 1 & 0 & 0 & 0 & ... \\ -1 & 1 & 0 & 0 & ... \\ 1 & -2 & 1 & 0 & ... \\ -1 & 3 & -3 & 1 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] \end{array} bi=∑j=0i(ij)ajM=⎣⎢⎢⎢⎢⎡1111...0123...0013...0001..................⎦⎥⎥⎥⎥⎤ai=∑j=0i(−1)i−j(ij)bjM−1=⎣⎢⎢⎢⎢⎡1−11−1...01−23...001−3...0001..................⎦⎥⎥⎥⎥⎤
二项式反演非常经典,举几个例子
错排问题,序列 1 , 2... n 1,2...n 1,2...n重排后,全部错位的排列方案数有多少
我们记 a i a_i ai为序列 1 , 2... i 1,2...i 1,2...i重排后的全部错位的方案数, b i b_i bi为序列 1 , 2... i 1,2...i 1,2...i重排后的错位个数为小于等于 i i i的方案数,一共就 i i i个数,那么 b i b_i bi不就是全排列么,而错位个数恰好为j的个数相当于i个数中选j个乘上j个数内部错排
写成表达式就是 b i = ∑ j = 0 i ( i j ) a j = i ! b_i=\sum_{j=0}^i \Big( \begin{array}{c} i \\ j \end{array} \Big) a_j = i! bi=∑j=0i(ij)aj=i!
根据二项式反演容易得到 a i = ∑ j = 0 i ( − 1 ) i − j ( i j ) j ! = ∑ j = 0 i ( − 1 ) i − j i ! j ! ( i − j ) ! j ! = i ! ∑ j = 0 i ( − 1 ) j j ! a_i=\sum_{j=0}^i (-1)^{i-j} \Big( \begin{array}{c} i \\ j \end{array} \Big) j! = \sum_{j=0}^i (-1)^{i-j} \frac{i!}{j!(i-j)!} j! = i!\sum_{j=0}^i \frac{(-1)^j}{j!} ai=∑j=0i(−1)i−j(ij)j!=∑j=0i(−1)i−jj!(i−j)!i!j!=i!∑j=0ij!(−1)j
这就是著名的错排公式
球染色问题,有n个球,k种颜色,相邻的两个球不能染相同颜色,全部k种颜色必须全部使用,求染色方案数
记 a i a_i ai为恰好使用 i i i种颜色的方案数,$b_i 为 使 用 小 于 等 于 为使用小于等于 为使用小于等于i$种颜色的方案数
第一个球 i i i种染法,后面每个球 i − 1 i-1 i−1种染法, b i = i ( i − 1 ) n − 1 b_i=i(i−1)^{n−1} bi=i(i−1)n−1,而 b i = ∑ j = 0 i ( i j ) a j b_i=\sum_{j=0}^i \Big( \begin{array}{c} i \\ j \end{array} \Big) a_j bi=∑j=0i(ij)aj,反演即可
序列比大小,给定序列 A A A,序列 B B B重排后, a i > b i a_i>b_i ai>bi对数等于 k k k的方案数有多少
学习中…(未完待续)
斯特林反演
单位根反演
最值反演
拉格朗日反演