一、符号约定及相关定义
符号约定
符号 | 定义 |
---|---|
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=0∑xf(x)
则有:
f
(
x
)
=
g
(
x
)
−
g
(
x
−
1
)
f(x)=g(x)-g(x-1)
f(x)=g(x)−g(x−1)
由于证明过于显然,在此不再赘述.
在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]
Δ=⎣⎢⎢⎡1−10...01−1...001...............⎦⎥⎥⎤
我们约定单位矩阵记作
I
I
I
则以下等式显然成立:
Σ
⋅
Δ
=
Δ
⋅
Σ
=
I
\Sigma\ ·\Delta= \Delta\ · \Sigma = I
Σ ⋅Δ=Δ ⋅Σ=I
I
⋅
I
=
I
I· I=I
I⋅I=I
2.子集反演
即高维前缀和反演,也称莫比乌斯反演(非数论).其正变换称为莫比乌斯变换(MT),逆变换为莫比乌斯逆变换(MI).
其一般形式为:
g
(
x
)
=
∑
i
∨
x
=
i
f
(
i
)
g(x)=\sum_{i∨x=i}f(i)
g(x)=i∨x=i∑f(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)=i∨x=i∑(−1)bit(x−i)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=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡1−1−11−11...010−10−1...001−100...000100...00001−1...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)=i∨j=x∑f(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)=i∧j=x∑f(i)∗g(j)
因为
A
∧
B
=
┐
(
┐
A
∨
┐
B
)
A\land B=┐(┐A∨┐B)
A∧B=┐(┐A∨┐B)
所以我们定义变换
Ω
\Omega
Ω:
x
→
┐
x
x \rightarrow ┐x
x→┐x
则:
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)=d∣x∑f(d)
则有:
f
(
x
)
=
∑
d
∣
x
g
(
d
)
μ
(
x
d
)
f(x)=\sum_{d|x}g(d)\mu(\frac{x}{d})
f(x)=d∣x∑g(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=0∑x(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=0∑x(−1)x−i(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=0∑x(−1)x−i(ix)g(i)=i=0∑x(−1)x−i(ix)j=0∑i(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=0∑xf(j)∗i=j∑x(−1)x−i(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)∣t∣−∣j∣的贡献,则总体贡献可以表示为
∑
(
−
1
)
i
(
∣
x
∣
−
∣
j
∣
i
)
=
(
1
−
1
)
∣
x
∣
−
∣
j
∣
\sum(-1)^i{{|x|-|j|}\choose i}=(1-1)^{|x|-|j|}
∑(−1)i(i∣x∣−∣j∣)=(1−1)∣x∣−∣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=0∑xf(j)∗i=j∑x(−1)x−i(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=0∑xf(j)∗(ji)(1−1)x−j=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
x→x+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=0∑n(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
x→x−1
>
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
(x−1)n=i=1∑n(−1)n−i(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..................⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡1−11−1...01−23...001−3...0001..................⎦⎥⎥⎥⎥⎤=I
二项式反演的应用:
二项式反演多运用于关于子集的容斥中.如著名的Venn图就属于子集容斥.
n个集合其中重叠k次的子集的个数等于
(
n
k
)
{n\choose k}
(kn).
相关例题:
错位排列问题
求长度为
n
n
n的排列
P
P
P,对
∀
i
≤
n
\forall_{i \le n}
∀i≤n满足
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=0∑x(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=0∑x(−1)x−i(ix)i!
=
x
!
∑
i
=
0
x
(
−
1
)
i
i
!
=x!\sum_{i=0}^x\frac{(-1)^i}{i!}
=x!i=0∑xi!(−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=0∑x(ix)f(i)
根据定义:
g
(
x
)
=
x
∗
(
x
−
1
)
n
−
1
g(x)=x*(x-1)^{n-1}
g(x)=x∗(x−1)n−1
所以:
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=0∑x(−1)x−i(ix)i(i−1)n−1
线性筛一下自然数幂即可做到
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=0∑x{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=0∑x(−1)x−i[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)!
(a−1)!.
所以显然有递推公式:
第一类斯特林数:
[
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]=(n−1)[mn−1]+[m−1n−1]
组合意义:加入的元素放入某个圆排列的贡献和等于圆排列大小.
第二类斯特林数:
{
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{mn−1}+{m−1n−1}
组合意义:加入的元素放入某个集合的贡献为1.
一些关于斯特林数的结论:
n
k
=
∑
i
=
1
k
{
k
i
}
⋅
n
i
‾
n^k=\sum_{i=1}^{k} { k\brace i}·n^{\underline{i}}
nk=i=1∑k{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=0∑k(−1)k−i[ik]ni
6.单位根反演
7.最值反演
最值反演又称
M
i
n
−
M
a
x
Min-Max
Min−Max反演,是一种基于集合子集的反演,并非线性反演。
但是在OI中运用颇多,这里详细的阐述一下.
M
i
n
−
M
a
x
Min-Max
Min−Max反演大概可以描述成以下形式:
有一个集合
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)=T⊂S∑(−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)=T⊂S∑(−1)∣T∣+1max(S)
证明很简单,我们以第一个式子为例(第二个同理):
我们将集合
S
S
S的
2
∣
S
∣
2^{|S|}
2∣S∣个子集划分成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 Min−Max容斥将问题简化.
例题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)=T⊂S∑(−1)∣T∣+1min(S)
于是题目变得显然了.
例题2:[HAOI2015]按位或
刚开始你有一个数字0,每一秒钟你会随机选择一个
[
0
,
2
n
−
1
]
[0,2^n-1]
[0,2n−1]的数字,与你手上的数字进行或操作。选择数字
i
i
i的概率是
p
i
p_i
pi。期望多少秒后,你手上的数字变成
2
n
−
1
2^n-1
2n−1
做法同上,只是求
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)=1−∑pT⊂R−S1
然后用FWT/FMT或者高维前缀和求一下即可.
例题3:现世重返
8.拉格朗日反演
9.圆反演
细节待补充,如有错误望提出.