错排问题Derangement
参考
错排问题(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=0∑n(−1)k(kn)(n−k)!=n!k=0∑nk!(−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)= S−i=1⋃nAi =n!−∣A1∪⋯∪An∣(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=1⋃nAi =k=1∑n(−1)k−11≤i1<⋯<ik≤n∑∣Ai1∩⋯∩Aik∣(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=1⋃nAi =i=1∑n(−1)i−1A[i](3)
四、固定k个的计数
如果固定 k k k 个位置,剩下 n − k n-k n−k 个任意排列个数为
∣ A i 1 ∩ ⋯ ∩ A i k ∣ = ( n − k ) ! \left| A_{i_1} \cap \cdots \cap A_{i_k} \right| = (n-k)! ∣Ai1∩⋯∩Aik∣=(n−k)!
所以
A [ i ] = ( n k ) ( n − k ) ! A_{[i]}=\binom{n}{k}(n-k)! A[i]=(kn)(n−k)! 带入(1)式便得证。
方法2: 用递推证明
一、递推关系
利用分步乘法原理
先把第一个元素放到一个不是自己位置的地方,一共有 n − 1 n-1 n−1 种选法。
放好之后, 放置第2个元素会出现两种情况:
- 如果没有和对应位置形成互换,那么剩下 n − 1 n-1 n−1 个元素继续错排,对应 D ( n − 1 ) D(n-1) D(n−1);
- 如果形成了互换(1 ↔ k),那么这两个位置固定,剩下 n − 2 n-2 n−2 个元素错排,对应 D ( n − 2 ) D(n-2) D(n−2)
{ 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)=(n−1)(D(n−1)+D(n−2)),n≥3
二、归一化
令:
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=bn−bn−1
四、化简递推
由原递推可得:
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=(1−n1)bn−1+n1bn−2
移项得:
c n = − 1 n c n − 1 c_n = -\frac{1}{n}c_{n-1} cn=−n1cn−1
五、初始结构(直接由归一化得到)
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=b1−b0=−1,c2=b2−b1=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=0∑nk!(−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=0∑nk!(−1)k
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)