线性离散反演
线性离散变换都可以表示为矩阵的形式
对于数列 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<y \\ 1 & x=y \\ 1-1 & x>y \end{array} \right. \\ & = \left\{ \begin{array}{cc} 1 & x=y \\ 0 & x \ne y \end{array} \right. \\ \\ \therefore MM^{-1}& = E \end{array} MM−1 x,y∴MM−1=Mx,yM−1 y,y+Mx,y+1M−1 y+1,y=⎩⎨⎧011−1x<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=∑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的方案数有多少
学习中…(未完待续)
斯特林反演
单位根反演
最值反演
拉格朗日反演