一.错排问题与错排数.
错排问题:对于一个排列 p i p_i pi,有多少种重新排列的方法使得重排后的序列 p i ′ p'_i pi′满足对于任意位置 i i i都有 p i ≠ p i ′ p_i\neq p'_i pi=pi′.
容易发现这个问题中的方案数只与排列的长度有关,与具体在第 i i i个位置的 p i p_i pi无关,所以我们有了错排数这样一个概念.
错排数:对于一个长度为 n n n的排列的错排数量,记为 D n D_n Dn.
关于错排数有一个小性质.
性质: ∑ i = 0 n ( n i ) D i = n ! \sum_{i=0}^{n}\binom{n}{i}D_i=n! ∑i=0n(in)Di=n!.
证明:
考虑对于每一个
i
i
i,
(
n
n
−
i
)
D
i
\binom{n}{n-i}D_i
(n−in)Di表示
n
n
n个数中选
i
i
i个数错排且
n
−
i
n-i
n−i个数不错排的方案数,显然求和后就是总排列数
n
!
n!
n!,于是就有:
n
!
=
∑
i
=
0
n
(
n
n
−
i
)
D
i
=
∑
i
=
0
n
(
n
i
)
D
i
n!=\sum_{i=0}^{n}\binom{n}{n-i}D_i=\sum_{i=0}^{n}\binom{n}{i}D_i
n!=i=0∑n(n−in)Di=i=0∑n(in)Di
证毕.
二.错排的递推公式.
求错排数的递推公式,可以通过分两类讨论:
1.已经有了前
n
−
1
n-1
n−1个数的错排数
D
n
−
1
D_{n-1}
Dn−1,现在要加入第
n
n
n个数,可以把第
n
n
n个数先放到第
n
n
n个位置,然后随便与前面的一个数交换位置,方案数为
(
n
−
1
)
D
n
−
1
(n-1)D_{n-1}
(n−1)Dn−1.
2.已经有了前
n
−
1
n-1
n−1个数,只有一个位置
k
k
k上是
k
k
k,其它都是错排,那么加入的第
n
n
n个数就必须与第
k
k
k个位置交换,方案数为
(
n
−
1
)
D
n
−
2
(n-1)D_{n-2}
(n−1)Dn−2.
于是我们可以得到错排的递推公式1:
D
n
=
(
n
−
1
)
(
D
n
−
1
+
D
n
−
2
)
D_n=(n-1)(D_{n-1}+D_{n-2})
Dn=(n−1)(Dn−1+Dn−2)
在OI中用的最多的就是这个公式.
不过考虑一下是不是可以求个更简单的递推式?考虑转化一下式子:
D
n
−
n
D
n
−
1
=
−
[
D
n
−
1
−
(
n
−
1
)
D
n
−
2
]
=
(
−
1
)
2
[
D
n
−
2
−
(
n
−
2
)
D
n
−
3
]
=
(
−
1
)
3
[
D
n
−
3
−
(
n
−
3
)
D
n
−
4
]
⋯
=
(
−
1
)
n
−
2
[
D
2
−
2
D
1
]
=
(
−
1
)
n
[
1
−
2
∗
0
]
=
(
−
1
)
n
D_n-nD_{n-1}=-[D_{n-1}-(n-1)D_{n-2}]\\ =(-1)^{2}[D_{n-2}-(n-2)D_{n-3}]\\ =(-1)^{3}[D_{n-3}-(n-3)D_{n-4}]\\ \cdots\\ =(-1)^{n-2}[D_2-2D_1]\\ =(-1)^{n}[1-2*0]\\ =(-1)^{n}
Dn−nDn−1=−[Dn−1−(n−1)Dn−2]=(−1)2[Dn−2−(n−2)Dn−3]=(−1)3[Dn−3−(n−3)Dn−4]⋯=(−1)n−2[D2−2D1]=(−1)n[1−2∗0]=(−1)n
然后再重新转化回来得到错排的递推公式2:
D
n
=
n
D
n
−
1
+
(
−
1
)
n
D_n=nD_{n-1}+(-1)^n
Dn=nDn−1+(−1)n
三.错排的容斥求解.
考虑错排数如何容斥?考虑枚举那些位置不动,直接大力容斥可以列出式子:
D
n
=
∑
T
∈
[
n
]
(
−
1
)
∣
T
∣
(
n
−
∣
T
∣
)
!
D_n=\sum_{T\in [n]}(-1)^{|T|}(n-|T|)!\\
Dn=T∈[n]∑(−1)∣T∣(n−∣T∣)!
我们发现每一个集合
T
T
T的贡献只与它的大小有关,所以可以化简式子:
D
n
=
∑
i
=
0
n
(
−
1
)
i
(
n
i
)
(
n
−
i
)
!
=
∑
i
=
0
n
(
−
1
)
i
∗
n
!
i
!
(
n
−
i
)
!
∗
(
n
−
i
)
!
=
∑
i
=
0
n
(
−
1
)
i
∗
n
!
i
!
=
n
!
∑
i
=
0
n
(
−
1
)
i
i
!
D_n=\sum_{i=0}^{n}(-1)^{i}\binom{n}{i}(n-i)!\\ =\sum_{i=0}^{n}(-1)^{i}*\frac{n!}{i!(n-i)!}*(n-i)!\\ =\sum_{i=0}^{n}(-1)^{i}*\frac{n!}{i!}\\ =n!\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}
Dn=i=0∑n(−1)i(in)(n−i)!=i=0∑n(−1)i∗i!(n−i)!n!∗(n−i)!=i=0∑n(−1)i∗i!n!=n!i=0∑ni!(−1)i
于是我们也可以得到错排的通项公式:
D
n
=
n
!
∑
i
=
0
n
(
−
1
)
i
i
!
D_n=n!\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}
Dn=n!i=0∑ni!(−1)i
其实不直接考虑容斥,根据一种提到的性质进行二项式反演也可以推:
n
!
=
∑
i
=
0
n
(
n
i
)
D
i
D
n
=
∑
i
=
0
n
(
−
1
)
n
−
i
(
n
i
)
i
!
D
n
=
n
!
∑
i
=
0
n
(
−
1
)
i
i
!
n!=\sum_{i=0}^{n}\binom{n}{i}D_i\\ D_n=\sum_{i=0}^{n}(-1)^{n-i}\binom{n}{i}i!\\ D_n=n!\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}
n!=i=0∑n(in)DiDn=i=0∑n(−1)n−i(in)i!Dn=n!i=0∑ni!(−1)i
不过由于二项式反演的本质也是一种容斥,所以就没有单独列一块了.
四.错排与自然底数的关系.
我们看一下错排数的通项公式:
D
n
=
n
!
∑
i
=
0
n
(
−
1
)
i
i
!
D_n=n!\sum_{i=0}^{n}\frac{(-1)^i}{i!}
Dn=n!i=0∑ni!(−1)i
再来看一下
e
n
e^{n}
en的泰勒展开:
e
n
=
∑
i
=
0
+
∞
n
i
i
!
e^{n}=\sum_{i=0}^{+\infty}\frac{n^i}{i!}
en=i=0∑+∞i!ni
我们代入一个
n
=
−
1
n=-1
n=−1进去:
e
−
1
=
∑
i
=
0
+
∞
(
−
1
)
i
i
!
e^{-1}=\sum_{i=0}^{+\infty}\frac{(-1)^i}{i!}
e−1=i=0∑+∞i!(−1)i
有没有发现这两个式子非常像啊?
我们可以写出
D
n
D_n
Dn在
n
n
n接近无穷大时的式子:
lim
n
→
+
∞
D
n
=
n
!
∑
i
=
0
n
(
−
1
)
i
i
!
lim
n
→
+
∞
D
n
n
!
=
∑
i
=
0
n
(
−
1
)
i
i
!
lim
n
→
+
∞
D
n
n
!
=
e
−
1
lim
n
→
+
∞
n
!
D
n
=
e
\lim_{n\rightarrow +\infty} D_n=n!\sum_{i=0}^{n}\frac{(-1)^i}{i!}\\ \lim_{n\rightarrow +\infty} \frac{D_n}{n!}=\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\\ \lim_{n\rightarrow +\infty} \frac{D_n}{n!}=e^{-1}\\ \lim_{n\rightarrow +\infty} \frac{n!}{D_n}=e\\
n→+∞limDn=n!i=0∑ni!(−1)in→+∞limn!Dn=i=0∑ni!(−1)in→+∞limn!Dn=e−1n→+∞limDnn!=e
也就是说 n n n越大时,一个长度为 n n n的排列方案数与长度为 n n n的错排方案数的比值越接近 e e e.