常见反演总结

一、符号约定及相关定义
符号约定
符号定义
f ( x ) f(x) f(x)关于x的函数f
A = [ x 1 , x 2 , . . . ] A=[x_1,x_2,...] A=[x1,x2,...]向量
A = { x 1 , x 2 , . . . } A=\{ x_1, x_2,...\} A={x1,x2,...}集合
| A A A|集合的基数
m i n ( A ) , m a x ( A ) min(A),max(A) min(A),max(A)集合的最小值/最大值
∑ , ∏ \sum,\prod ,求和与求积
a i + b ai+b ai+b复数
ω n \omega_n ωn单位复根
( a b ) {a\choose b} (ba) , [ b a ] , { b a } ,\big[^a_b\big],\big\{^a_b\big\} ,[ba],{ba}组合数、第一、第二类斯特林数
[ x 11 x 12 . . . x 21 x 22 . . . . . . . . . . . . ] \left[\begin{matrix}x_{11} & x_{12} & ... \\x_{21} & x_{22} & ... \\... & ... & ...\end{matrix}\right] x11x21...x12x22............矩阵

P.S.通过中括号是否为粗体区分矩阵纵向量与第一类斯特林数.

相关定义
反演

若有函数 f ( x ) f(x) f(x),变换 [ ∗ ] [*] [],使得:
g ( x ) = ( f ∗ ) ( x ) g(x)=(f^*)(x) g(x)=(f)(x)
且存在变换 [ & ] [\&] [&],使得:
( g & ) ( x ) = f ( x ) (g^\&)(x)=f(x) (g&)(x)=f(x)
则我们称 [ & ] [\&] [&]互为 [ ∗ ] [*] []反演变换.

最常见的反演变换有求导积分,该组反演变换大致可以写成如下形式:
∫ f ′ ( x ) d x = f ( x ) + c \int f'(x) dx=f(x) + c f(x)dx=f(x)+c

线性反演

若存在线性变换 [ & ] , [ ∗ ] [\&],[*] [&],[],互为反演变换,则称 [ & ] , [ ∗ ] [\&],[*] [&],[]互为线性反演变换.
一般地:线性变换可以描述成一个矩阵的形式.

常见的比如说离散傅里叶变换(DFT),离散傅里叶逆变换(IDFT).

互为线性反演变换的变换矩阵相乘的结果为单位矩阵.

互为反演变换的变换矩阵乘法满足交换律.其余只满足结合律.

本文主要探讨常见的离散的线性反演变换.

与此相对的非线性反演在本文不再过多涉及.

二、常见线性离散反演总结
1.前缀和反演

令函数 f ( x ) , g ( x ) f(x),g(x) f(x),g(x) N ∗ \Nu_* N下有定义,使得
g ( x ) = ∑ i = 0 x f ( x ) g(x)=\sum^x_{i=0}f(x) g(x)=i=0xf(x)
则有:
f ( x ) = g ( x ) − g ( x − 1 ) f(x)=g(x)-g(x-1) f(x)=g(x)g(x1)
由于证明过于显然,在此不再赘述.
在OI/ACM界中该正变换被称作前缀和,逆变换被成为差分.
其我们约定前缀和变换记作 Σ \Sigma Σ,其矩阵形式为:
Σ = [ 1 0 0 . . . 1 1 0 . . . 1 1 1 . . . . . . . . . . . . . . . ] \Sigma=\left[ \begin{matrix} 1 & 0 & 0 & ... \\ 1 & 1 & 0 & ... \\ 1 & 1 & 1 & ... \\ ... & ... & ... & ... \end{matrix} \right] Σ=111...011...001...............
大致可以描述为一个全1的下三角.
约定差分变换记作 Δ \Delta Δ,其矩阵形式为:
Δ = [ 1 0 0 . . . − 1 1 0 . . . 0 − 1 1 . . . . . . . . . . . . . . . ] \Delta=\left[ \begin{matrix} 1 & 0 & 0 & ... \\ -1 & 1 & 0 & ... \\ 0 & -1 & 1 & ... \\ ... & ... & ... & ... \end{matrix} \right] Δ=110...011...001...............
我们约定单位矩阵记作 I I I
则以下等式显然成立:
Σ   ⋅ Δ = Δ   ⋅ Σ = I \Sigma\ ·\Delta= \Delta\ · \Sigma = I Σ Δ=Δ Σ=I
I ⋅ I = I I· I=I II=I

2.子集反演

即高维前缀和反演,也称莫比乌斯反演(非数论).其正变换称为莫比乌斯变换(MT),逆变换为莫比乌斯逆变换(MI).
其一般形式为:
g ( x ) = ∑ i ∨ x = i f ( i ) g(x)=\sum_{i∨x=i}f(i) g(x)=ix=if(i)
f ( x ) = ∑ i ∨ x = i ( − 1 ) b i t ( x − i ) g ( i ) f(x)=\sum_{i∨x=i}(-1)^{bit(x- i)}g(i) f(x)=ix=i(1)bit(xi)g(i)
其中 [ ∨ ] [∨] []表示按位或运算, b i t ( x ) bit(x) bit(x)表示 x x x二进制下的1的个数.
证明很容易,我们可以将长度为 s s s二进制想象成一个 s s s维的01向量,正变换相当于做一个 s s s维的前缀和,逆变换相当于差分出原来的数组,然后考虑容斥,参考二维前缀和的差分方式,我们很容易发现如果有偶数维与原数不同的会被多减去1次,所以需要加上,奇数维与原数不同的会被少减去一次,所以需要减去.
其矩阵形式为一般如下:
Σ k = [ 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 . . . . . . . . . . . . . . . . . . . . . . . . ] \Sigma^k=\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] Σk=111111...010101...001100...000100...000011...000001........................

Δ k = [ 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 . . . . . . . . . . . . . . . . . . . . . . . . ] \Delta^k=\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] Δk=111111...010101...001100...000100...000011...000001........................
Σ k ∗ Δ k = I \Sigma^k*\Delta^k=I ΣkΔk=I
应用:
快速莫比乌斯变换(FMT):

int len, bit;
void FMT(int *p){
    for(int i = 0;i < bit;i ++) for(int j = 0;j < len;j ++) 
      { if( j & (1 << i) ) p[j] += p[j - (1 << i)]; }
}

快速莫比乌斯逆变换(FMI)
就是对差分过程的一点优化.形式上与正变换基本相同.

int len, bit;
void FMI(int *p){
    for(int i = 0;i < bit;i ++) for(int j = 0;j < len;j ++) 
      { if( j & (1 << i) ) p[j] -= p[j - (1 << i)]; }
}

子集或卷积:
定义函数 f ( x ) , g ( x ) , h ( x ) f(x),g(x),h(x) f(x),g(x),h(x).已知 f ( x ) , g ( x ) f(x),g(x) f(x),g(x)求:
h ( x ) = ∑ i ∨ j = x f ( i ) ∗ g ( j ) h(x)=\sum_{i∨j=x}f(i)*g(j) h(x)=ij=xf(i)g(j)
很容易发现:
( Σ k h ) ( x ) = ( Σ k f ) ( x ) ∗ ( Σ k g ) ( x ) (\Sigma^kh)(x)=(\Sigma^kf)(x)*(\Sigma^kg)(x) (Σkh)(x)=(Σkf)(x)(Σkg)(x)
于是:
h ( x ) = ( Δ k ( ( Σ k f ) ⋅ ( Σ k g ) ) ) ( x ) h(x)=(\Delta^k((\Sigma^kf)·(\Sigma^kg)))(x) h(x)=(Δk((Σkf)(Σkg)))(x)
所以可以两遍FMT,一遍FMI解决.
子集与卷积:
定义函数 f ( x ) , g ( x ) , h ( x ) f(x),g(x),h(x) f(x),g(x),h(x).已知 f ( x ) , g ( x ) f(x),g(x) f(x),g(x)求:
h ( x ) = ∑ i ∧ j = x f ( i ) ∗ g ( j ) h(x)=\sum_{i\land j=x}f(i)*g(j) h(x)=ij=xf(i)g(j)
因为
A ∧ B = ┐ ( ┐ A ∨ ┐ B ) A\land B=┐(┐A∨┐B) AB=(AB)
所以我们定义变换 Ω \Omega Ω: x → ┐ x x \rightarrow ┐x xx
则:
h ( x ) = ( Ω Δ k ( ( Ω Σ k f ) ⋅ ( Ω Σ k g ) ) ) ( x ) h(x)=(\Omega\Delta^k((\Omega\Sigma^kf)·(\Omega\Sigma^kg)))(x) h(x)=(ΩΔk((ΩΣkf)(ΩΣkg)))(x)
即可简单算出.
位运算卷积的总结
有些卷积就要用到FWT了,这里不再赘述。
但是我们可以把16中二进制运算的大致归下类:
首先我们可以把位运算写成这种特殊的真值表.
在这里插入图片描述
比如说上图表示 按位或 运算的真值表. 表示有一为真即为真.
于是我们发现位运算可以构成一个群(具体名字忘记了).
并且有三种可以简单处理的变换即是。
交换行,交换列,颜色取反,旋转90度。分别对应位运算:
a $ b = c a\$b=c a$b=c
中把 a取反, b 取反, c取反,交换ab.其中前三个我们可以用一些简单的代码转换.

void FCP(int *A){
	for(int i = 0;i < len >> 1;i ++) swap( A[i], A[i ^ (len - 1)] );
}

于是16中位运算可以分成本不同的4类:
在这里插入图片描述然后1号部分都可以用FMT求,2号部分只与一个变量有关,所以可以简单处理,3号部分必须使用FWT,4号部分与两个变量均无关.

3.莫比乌斯反演

令函数 f ( x ) , g ( x ) f(x),g(x) f(x),g(x),使得:
g ( x ) = ∑ d ∣ x f ( d ) g(x)=\sum_{d|x}f(d) g(x)=dxf(d)
则有:
f ( x ) = ∑ d ∣ x g ( d ) μ ( x d ) f(x)=\sum_{d|x}g(d)\mu(\frac{x}{d}) f(x)=dxg(d)μ(dx)
于是我们可以发现狄利克雷卷积一个数论函数都是线性变换, 其反演变换相当于卷积上其狄利克雷卷积的逆元.
其矩阵形式一般为:
∗ k = [ k ( 1 ) 0 0 0 0 0 . . . k ( 2 ) k ( 1 ) 0 0 0 0 . . . k ( 3 ) 0 k ( 1 ) 0 0 0 . . . k ( 4 ) k ( 2 ) 0 k ( 1 ) 0 0 . . . k ( 5 ) 0 0 0 k ( 1 ) 0 . . . k ( 6 ) k ( 3 ) k ( 2 ) 0 0 k ( 1 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . ] ^*k=\left[ \begin{matrix} k(1) & 0 & 0 & 0 & 0 & 0 & ... \\ k(2) & k(1) & 0 & 0 & 0 & 0 & ... \\ k(3) & 0 & k(1) & 0 & 0 & 0 & ... \\ k(4) & k(2) & 0 & k(1) & 0 & 0 & ... \\ k(5) & 0 & 0 & 0 & k(1) & 0 & ... \\ k(6) & k(3) & k(2) & 0 & 0 & k(1) & ... \\ ... & ... & ... & ... & ... & ... & ... & ...\end{matrix} \right] k=k(1)k(2)k(3)k(4)k(5)k(6)...0k(1)0k(2)0k(3)...00k(1)00k(2)...000k(1)00...0000k(1)0...00000k(1)...........................
k k k表示被卷上的数论函数, ∗ k ^*k k表示狄利克雷卷积变换.
其中莫比乌斯反演表示 k = μ k=\mu k=μ时的情况.
狄利克雷卷积的矩阵相乘满足交换律.
https://blog.csdn.net/qq_35703773/article/details/85846839 中对该反演有更详细的介绍.

4.二项式反演

令函数 f ( x ) , g ( x ) f(x),g(x) f(x),g(x),使得:
g ( x ) = ∑ i = 0 x ( x i ) f ( i ) g(x)=\sum_{i=0}^x{x\choose i}f(i) g(x)=i=0x(ix)f(i)
则有:
f ( x ) = ∑ i = 0 x ( − 1 ) x − i ( x i ) g ( i ) f(x)=\sum_{i=0}^x(-1)^{x-i}{x\choose i}g(i) f(x)=i=0x(1)xi(ix)g(i)
考虑基于结论的证明:
f ( x ) = ∑ i = 0 x ( − 1 ) x − i ( x i ) g ( i ) = ∑ i = 0 x ( − 1 ) x − i ( x i ) ∑ j = 0 i ( i j ) f ( j ) f(x)=\sum_{i=0}^x(-1)^{x-i}{x\choose i}g(i)=\sum_{i=0}^x(-1)^{x-i}{x\choose i}\sum^i_{j=0}{i\choose j}f(j) f(x)=i=0x(1)xi(ix)g(i)=i=0x(1)xi(ix)j=0i(ji)f(j)
= ∑ j = 0 x f ( j ) ∗ ∑ i = j x ( − 1 ) x − i ( x i ) ( i j ) =\sum_{j=0}^xf(j)*\sum^x_{i=j}(-1)^{x-i}{x\choose i}{i\choose j} =j=0xf(j)i=jx(1)xi(ix)(ji)
考虑 ( x i ) ( i j ) {x\choose i}{i\choose j} (ix)(ji)的组合意义,表示对于选取任何一个基数为 ∣ x ∣ |x| x的基数为 ∣ j ∣ |j| j的子集,任何一个 ∣ x ∣ |x| x的子集 ∣ t ∣ |t| t包含 ∣ j ∣ |j| j,则会产生 ( − 1 ) ∣ t ∣ − ∣ j ∣ (-1)^{|t|-|j|} (1)tj的贡献,则总体贡献可以表示为 ∑ ( − 1 ) i ( ∣ x ∣ − ∣ j ∣ i ) = ( 1 − 1 ) ∣ x ∣ − ∣ j ∣ \sum(-1)^i{{|x|-|j|}\choose i}=(1-1)^{|x|-|j|} (1)i(ixj)=(11)xj,所以:

∑ j = 0 x f ( j ) ∗ ∑ i = j x ( − 1 ) x − i ( x i ) ( i j ) \sum_{j=0}^xf(j)*\sum^x_{i=j}(-1)^{x-i}{x\choose i}{i\choose j} j=0xf(j)i=jx(1)xi(ix)(ji)
= ∑ j = 0 x f ( j ) ∗ ( i j ) ( 1 − 1 ) x − j = f ( x ) =\sum_{j=0}^xf(j)*{i\choose j}(1-1)^{x-j}=f(x) =j=0xf(j)(ji)(11)xj=f(x)
其证明与莫比乌斯反演证明有许多共同之处.
当然,基于结论证明是不好的,我们可以用一种更加感性的方法理解一下这个反演.
我们假设原函数 f ( x ) f(x) f(x)的一个生成函数:
F ( x ) = f ( 0 ) x 0 + f ( 1 ) x 1 + f ( 2 ) x 2 + . . . F(x)=f(0)x^0+f(1)x^1+f(2)x^2+... F(x)=f(0)x0+f(1)x1+f(2)x2+...
F ( x ) F(x) F(x)的系数表示成一个向量:
[ f ( 0 ) , f ( 1 ) , f ( 2 ) , . . . ] [f(0),f(1),f(2),...] [f(0),f(1),f(2),...]
我们将生成函数上的一个变换记作 [ < 1 ] [<^1] [<1]: 表示 x → x + 1 x\rightarrow x+1 xx+1,即表示把图像F(x)向左位移一个单位,改变换可以表示成矩阵的形式:
< 1 = [ 0 0 0 0 . . . 1 0 0 0 . . . 0 1 0 0 . . . 0 0 1 0 . . . . . . . . . . . . . . . . . . ] <^1=\left[ \begin{matrix} 0 & 0 & 0 & 0 & ... \\ 1 & 0 & 0 & 0 & ... \\ 0 & 1 & 0 & 0 & ... \\ 0 & 0 & 1 & 0 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] <1=0100...0010...0001...0000..................
由二项式定理我们可以发现:
( x + 1 ) n = ∑ i = 0 n ( n i ) x i (x+1)^n=\sum_{i=0}^n {n\choose i} x^i (x+1)n=i=0n(in)xi
于是我们可以用 F ( x ) F(x) F(x)上的 [ < 1 ] [<^1] [<1]变换表示 f ( x ) f(x) f(x)上的二项式反演正变换.

基于 [ < 1 ] [<^1] [<1]我们很容易得到它的逆变换 [ > 1 ] [>^1] [>1] x → x − 1 x\rightarrow x-1 xx1
> 1 = [ 0 1 0 0 . . . 0 0 1 0 . . . 0 0 0 1 . . . 0 0 0 0 . . . . . . . . . . . . . . . . . . ] >^1=\left[ \begin{matrix} 0 & 1 & 0 & 0 & ... \\ 0 & 0 & 1 & 0 & ... \\ 0 & 0 & 0 & 1 & ... \\ 0 & 0 & 0 & 0 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] >1=0000...1000...0100...0010..................
显然 > 1 ∗ < 1 = I >^1*<^1=I >1<1=I.
又由二项式定理得:
( x − 1 ) n = ∑ i = 1 n ( − 1 ) n − i ( n i ) x i (x-1)^n=\sum_{i=1}^n(-1)^{n-i}{n\choose i}x^i (x1)n=i=1n(1)ni(in)xi
所以我们可以用 F ( x ) F(x) F(x)上的 [ < 1 ] [<^1] [<1]表示二项式反演的逆变换.
综上所述:
[ 1 0 0 0 . . . 1 1 0 0 . . . 1 2 1 0 . . . 1 3 3 1 . . . . . . . . . . . . . . . . . . ] [ 1 0 0 0 . . . − 1 1 0 0 . . . 1 − 2 1 0 . . . − 1 3 − 3 1 . . . . . . . . . . . . . . . . . . ] = I \left[ \begin{matrix} 1 & 0 & 0 & 0 & ... \\ 1 & 1 & 0 & 0 & ... \\ 1 & 2 & 1 & 0 & ... \\ 1 & 3 & 3 & 1 & ... \\ ... & ... & ... & ... & ... \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 & 0 & ... \\ -1 & 1 & 0 & 0 & ... \\ 1 & -2 & 1 & 0 & ... \\ -1 & 3 & -3 & 1 & ... \\... & ... & ... & ... & ... \end{matrix} \right]=I 1111...0123...0013...0001..................1111...0123...0013...0001..................=I
二项式反演的应用:
二项式反演多运用于关于子集的容斥中.如著名的Venn图就属于子集容斥.Venn图
n个集合其中重叠k次的子集的个数等于 ( n k ) {n\choose k} (kn).

相关例题:

错位排列问题
求长度为 n n n的排列 P P P,对 ∀ i ≤ n \forall_{i \le n} in满足 P i ≠ i P_i \neq i Pi=i的种类数.
解法:
我们令 n n n个位置中恰好有 x x x个位置错位的排列个数为 f ( x ) f(x) f(x),显然我们要求的答案就是 f ( n ) f(n) f(n).

我们令 g ( x ) g(x) g(x)表示 n n n个位置中有小于 x x x个位置错位的排列个数,
可以发现 x x x的所有子集都对 x x x有贡献.所以:
g ( x ) = ∑ i = 0 x ( x i ) f ( i ) g(x)=\sum^x_{i=0}{x\choose i}f(i) g(x)=i=0x(ix)f(i)
根据定义我们可以简单的求出:
g ( x ) = x ! g(x)=x! g(x)=x!
所以,根据二项式反演公式我们可以得到:
f ( x ) = ∑ i = 0 x ( − 1 ) x − i ( x i ) i ! f(x)=\sum^x_{i=0}(-1)^{x-i}{x\choose i}i! f(x)=i=0x(1)xi(ix)i!
= x ! ∑ i = 0 x ( − 1 ) i i ! =x!\sum_{i=0}^x\frac{(-1)^i}{i!} =x!i=0xi!(1)i
该式子可以预处理阶乘及逆元, O ( n ) O(n) O(n)求解.

球染色问题
有n个球,k种颜色,相邻的两个球不能染相同颜色,全部k种颜色必须全部使用,求染色方案数.

解法:
我们依然定义 f ( x ) f(x) f(x)为恰好使用 x x x种颜色的方案数. g ( x ) g(x) g(x)为使用小于等于 x x x种颜色的方案数.显然 g ( x ) g(x) g(x) x x x的子集对 x x x一定有贡献,则:
g ( x ) = ∑ i = 0 x ( x i ) f ( i ) g(x)=\sum^x_{i=0}{x\choose i}f(i) g(x)=i=0x(ix)f(i)
根据定义:
g ( x ) = x ∗ ( x − 1 ) n − 1 g(x)=x*(x-1)^{n-1} g(x)=x(x1)n1
所以:
f ( x ) = ∑ i = 0 x ( − 1 ) x − i ( x i ) i ( i − 1 ) n − 1 f(x)=\sum_{i=0}^x(-1)^{x-i}{x\choose i}i(i-1)^{n-1} f(x)=i=0x(1)xi(ix)i(i1)n1
线性筛一下自然数幂即可做到 O ( n ) O(n) O(n).
其它例题:
例题1
例题2

5.斯特林反演

令函数 f ( x ) , g ( x ) f(x),g(x) f(x),g(x),使得:
g ( x ) = ∑ i = 0 x { x i } f ( x ) g(x)=\sum_{i=0}^x{x\brace i}f(x) g(x)=i=0x{ix}f(x)
则有:
f ( x ) = ∑ i = 0 x ( − 1 ) x − i [ x i ] g ( x ) f(x)=\sum_{i=0}^x(-1)^{x-i}{x\brack i}g(x) f(x)=i=0x(1)xi[ix]g(x)
关于定义:
第一类斯特林数: 将 n n n个元素划分成 m m m圆排列的方案数.
第二类斯特林数: 将 n n n个元素划分成 m m m集合的方案数.
圆排列:首尾相接的排列.我们称两个圆排列 A , B A,B A,B相同仅当组成 A , B A,B A,B的元素相同且 B B B可以由 A A A转置得到.若集合 A A A, ∣ A ∣ |A| A=a,则该集合内的元素可以构成不同的圆排列个数为 ( a − 1 ) ! (a-1)! (a1)!.
所以显然有递推公式:

第一类斯特林数:
[ n m ] = ( n − 1 ) [ n − 1 m ] + [ n − 1 m − 1 ] {n\brack m}=(n-1){n - 1\brack m}+{n - 1\brack m - 1} [mn]=(n1)[mn1]+[m1n1]
组合意义:加入的元素放入某个圆排列的贡献和等于圆排列大小.
第二类斯特林数:
{ n m } = m { n − 1 m } + { n − 1 m − 1 } {n\brace m}=m{n - 1\brace m}+{n - 1\brace m - 1} {mn}=m{mn1}+{m1n1}
组合意义:加入的元素放入某个集合的贡献为1.

一些关于斯特林数的结论:

n k = ∑ i = 1 k { k i } ⋅ n i ‾ n^k=\sum_{i=1}^{k} { k\brace i}·n^{\underline{i}} nk=i=1k{ik}ni
组合意义: n个有标号小球,k种颜色,染色方案为 n k n^k nk,也可以表示成把n个小球分成i个集合每种集合内染一样颜色,但不同集合颜色互不相同的方案.
斯特林反演以后可以得到:
n k ‾ = ∑ i = 0 k ( − 1 ) k − i [ k i ] n i n^{\underline{k}}=\sum_{i=0}^k (-1) ^{k-i} {k \brack i}n^i nk=i=0k(1)ki[ik]ni

6.单位根反演
7.最值反演

最值反演又称 M i n − M a x Min-Max MinMax反演,是一种基于集合子集的反演,并非线性反演。
但是在OI中运用颇多,这里详细的阐述一下.
M i n − M a x Min-Max MinMax反演大概可以描述成以下形式:
有一个集合 S S S,则:
m a x ( S ) = ∑ T ⊂ S ( − 1 ) ∣ T ∣ + 1 m i n ( S ) max(S)=\sum_{T\subset S}(-1)^{|T|+1}min(S) max(S)=TS(1)T+1min(S)
m i n ( S ) = ∑ T ⊂ S ( − 1 ) ∣ T ∣ + 1 m a x ( S ) min(S)=\sum_{T\subset S}(-1)^{|T|+1}max(S) min(S)=TS(1)T+1max(S)
证明很简单,我们以第一个式子为例(第二个同理):
我们将集合 S S S 2 ∣ S ∣ 2^{|S|} 2S个子集划分成4类:
∅ , { M a x } , T , T ∪ { M a x } \emptyset,\{Max\},T,T\cup\{Max\} ,{Max},T,T{Max}
其中 T T T不包含元素 M a x Max Max,且存在唯一的 T ∪ { M a x } T\cup\{Max\} T{Max}与之配对,互相抵消,所以最终的贡献只剩下 M a x Max Max.

因为概率期望等奇怪的东西一般互相之间是线性无关的,所以可以用 M i n − M a x Min-Max MinMax容斥将问题简化.

例题1: hdu4336 Card Collector
有n个卡片,第 i i i个的出现概率为 p i p_i pi,求全部出现至少一次的期望时间.

我们令 m i n ( S ) min(S) min(S) S S S集合中出现一个的期望步数, m a x ( s ) max(s) max(s)为全部出现的期望步数:
由于一些神秘因素(如果我弄明白了一定来补充)
m a x ( S ) = ∑ T ⊂ S ( − 1 ) ∣ T ∣ + 1 m i n ( S ) max(S)=\sum_{T\subset S}(-1)^{|T|+1}min(S) max(S)=TS(1)T+1min(S)
于是题目变得显然了.

例题2:[HAOI2015]按位或
刚开始你有一个数字0,每一秒钟你会随机选择一个 [ 0 , 2 n − 1 ] [0,2^n-1] [0,2n1]的数字,与你手上的数字进行或操作。选择数字 i i i的概率是 p i p_i pi。期望多少秒后,你手上的数字变成 2 n − 1 2^n-1 2n1
做法同上,只是求 m i n ( S ) min(S) min(S)的时候要简单变形为:

m i n ( S ) = 1 1 − ∑ p T ⊂ R − S min(S)=\frac{1}{1-\sum p_{T \subset {R-S}}} min(S)=1pTRS1

然后用FWT/FMT或者高维前缀和求一下即可.

例题3:现世重返

8.拉格朗日反演
9.圆反演

细节待补充,如有错误望提出.

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值