参考

实数列上的运算变换定理.csdn

容斥定理的非数学归纳证明.csdn

错排问题(Derangement)

问题描述

给定 n n n 个元素,将它们重新排列,使得没有任何一个元素出现在原来的位置上。这样的排列称为“错排”,其数量记作 ! n !n !n

目标

D ( n ) = ∑ k = 0 n ( − 1 ) k ( n k ) ( n − k ) ! = n ! ∑ k = 0 n ( − 1 ) k k ! D(n) = \sum_{k=0}^{n} (-1)^k \binom{n}{k} (n-k)!=n! \sum_{k=0}^{n} \frac{(-1)^k}{k!} D(n)=k=0n(1)k(kn)(nk)!=n!k=0nk!(1)k

方法1: 用容斥定理证明


一、集合建模

设:
S = { 所有  n  元排列 } S = \{\text{所有 } n \text{ 元排列}\} S={所有 n 元排列}

则:
∣ S ∣ = n ! |S| = n! S=n!


二、定义“坏事件”(固定点)

对每个 i = 1 , 2 , … , n i = 1,2,\dots,n i=1,2,,n,定义事件:

A i = { σ ∈ S ∣ σ ( i ) = i } A_i = \{\sigma \in S \mid \sigma(i) = i\} Ai={σSσ(i)=i}

即:第 i i i 个元素在原位置(固定点)

三、目标(错排定义)

D ( n ) = ∣ S − ⋃ i = 1 n A i ∣ = n ! − ∣ A 1 ∪ ⋯ ∪ A n ∣ (1) D(n) = \left| S- \bigcup_{i=1}^{n} A_i \right| = n! - \left|A_1 \cup \cdots \cup A_n\right| \tag{1} D(n)= Si=1nAi =n!A1An(1)

∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k − 1 ∑ 1 ≤ i 1 < ⋯ < i k ≤ n ∣ A i 1 ∩ ⋯ ∩ A i k ∣ (2) \left|\bigcup_{i=1}^{n} A_{i}\right| = \sum_{k=1}^{n} (-1)^{k-1} \sum_{1 \le i_1 < \cdots < i_k \le n} \left|A_{i_1} \cap \cdots \cap A_{i_k}\right| \tag{2} i=1nAi =k=1n(1)k11i1<<iknAi1Aik(2)

∣ ⋃ i = 1 n A i ∣ = ∑ i = 1 n ( − 1 ) i − 1 A [ i ] (3) \left|\bigcup_{i=1}^{n} A_{i}\right|=\sum_{i=1}^{n}(-1)^{i-1} A_{[i]} \tag{3} i=1nAi =i=1n(1)i1A[i](3)

四、固定k个的计数

如果固定 k k k 个位置,剩下 n − k n-k nk 个任意排列个数为

∣ A i 1 ∩ ⋯ ∩ A i k ∣ = ( n − k ) ! \left| A_{i_1} \cap \cdots \cap A_{i_k} \right| = (n-k)! Ai1Aik=(nk)!

所以
A [ i ] = ( n k ) ( n − k ) ! A_{[i]}=\binom{n}{k}(n-k)! A[i]=(kn)(nk)! 带入(1)式便得证。

方法2: 用递推证明

一、递推关系

利用分步乘法原理

先把第一个元素放到一个不是自己位置的地方,一共有 n − 1 n-1 n1 种选法。
放好之后, 放置第2个元素会出现两种情况:

  • 如果没有和对应位置形成互换,那么剩下 n − 1 n-1 n1 个元素继续错排,对应 D ( n − 1 ) D(n-1) D(n1)
  • 如果形成了互换(1 ↔ k),那么这两个位置固定,剩下 n − 2 n-2 n2 个元素错排,对应 D ( n − 2 ) D(n-2) D(n2)
    { D ( 1 ) = 0 , D ( 2 ) = 1 D ( n ) = ( n − 1 ) ( D ( n − 1 ) + D ( n − 2 ) ) , n ≥ 3 \begin{cases} D(1)=0,\quad D(2)=1 \\ D(n) = (n-1)\big(D(n-1) + D(n-2)\big), \quad n \ge 3 \end{cases} {D(1)=0,D(2)=1D(n)=(n1)(D(n1)+D(n2)),n3

二、归一化

令:

b n = D ( n ) n ! b_n = \frac{D(n)}{n!} bn=n!D(n)


三、差分定义

令:

c n = b n − b n − 1 c_n = b_n - b_{n-1} cn=bnbn1


四、化简递推

由原递推可得:

b n = ( 1 − 1 n ) b n − 1 + 1 n b n − 2 b_n = \left(1-\frac{1}{n}\right)b_{n-1} + \frac{1}{n}b_{n-2} bn=(1n1)bn1+n1bn2

移项得:

c n = − 1 n c n − 1 c_n = -\frac{1}{n}c_{n-1} cn=n1cn1


五、初始结构(直接由归一化得到)

b 1 = 0 , b 2 = 1 2 b_1 = 0,\quad b_2 = \frac{1}{2} b1=0,b2=21

c 1 = b 1 − b 0 = − 1 , c 2 = b 2 − b 1 = 1 2 c_1 = b_1 - b_0 = -1,\quad c_2 = b_2 - b_1 = \frac{1}{2} c1=b1b0=1,c2=b2b1=21

(取 b 0 = 1 b_0=1 b0=1


六、差分展开

c n = ( − 1 ) n n ! c 0 c_n = \frac{(-1)^n}{n!}c_0 cn=n!(1)nc0


七、恢复 b n b_n bn

b n = ∑ k = 0 n ( − 1 ) k k ! b_n = \sum_{k=0}^{n} \frac{(-1)^k}{k!} bn=k=0nk!(1)k


八、还原 D ( n ) D(n) D(n)

D ( n ) = n ! b n D(n) = n! b_n D(n)=n!bn


九、最终结果

D ( n ) = n ! ∑ k = 0 n ( − 1 ) k k ! D(n) = n! \sum_{k=0}^{n} \frac{(-1)^k}{k!} D(n)=n!k=0nk!(1)k

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐