反演

线性离散反演

线性离散变换都可以表示为矩阵的形式

对于数列 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=M1B,则变换 M M M与变换 M − 1 M^{-1} M1互为反演变换

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=bibi1M1=1100...0110...0011...0001..................
证明, M M − 1 = E MM^{-1}=E MM1=E,考虑 M − 1 M^{-1} M1 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 & xy \end{array} \right. \\ & = \left\{ \begin{array}{cc} 1 & x=y \\ 0 & x \ne y \end{array} \right. \\ \\ \therefore MM^{-1}& = E \end{array} MM1 x,yMM1=Mx,yM1 y,y+Mx,y+1M1 y+1,y=0111x<yx=yx>y={10x=yx=y=E

这就是前缀和与差分,很好理解,可以推广到多维(定义域为 { 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=jiaj M=111111...010101...001001...000100...000010...000001........................ai=jiμ(ji)bjM1=μ(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 MM1=E,考虑 M M M x x x行与 M − 1 M^{-1} M1 y y y列中的第 k k k项,显然第 k k k项非零条件为 [ k ∣ x ] [ k ∣ y ] [k|x][k|y] [kx][ky]
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 ji=i表示 j j j i i i子集, i − j i-j ij表示指定全集 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=ji=iaj M=111111...010101...001100...000100...000011...000001........................ai=ji=i(1)bits_cnt(ij)bjM1=111111...010101...001100...000100...000011...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)ij(ij)bjM1=1111...0123...0013...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)ij(ij)j!=j=0i(1)ijj!(ij)!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 i1种染法, b i = i ( i − 1 ) n − 1 b_i=i(i−1)^{n−1} bi=i(i1)n1,而 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的方案数有多少

学习中…(未完待续)

斯特林反演

单位根反演

最值反演

拉格朗日反演

你可能感兴趣的:(acm随笔2020)