错排问题
问题描述
对于一个长度为 nnn 全排列 AAA,求问有多少种 AAA 的排列,使得对于所有的整数 iii,1≤i≤n1 \leq i \leq n1≤i≤n,都有 Ai≠iA_i \not = iAi=i?
公式推导
第一种:O(1)公式
以下内容定义 A1,A2,...,AnA_1,A_2,...,A_nA1,A2,...,An 为 nnn 个集合,SSS 为全集。
首先,我们要知道容斥原理的公式:
∣A1∪A2∪...∪An∣=∑i=1n∣Ai∣−∑1≤i<j≤n∣Ai∩Aj∣+∑1≤i<j<k≤n∣Ai∩Aj∩Ak∣−...+(−1)n−1∣A1∩A2∩...∩An∣\mid A_1 \cup A_2 \cup ... \cup A_n \mid = \quad\displaystyle\sum_{i=1}^n \mid A_i \mid - \quad\displaystyle\sum_{1 \leq i < j \leq n} \mid A_i \cap A_j \mid + \quad\displaystyle\sum_{1 \leq i<j<k \leq n} \mid A_i \cap A_j \cap A_k \mid -...+(-1)^{n-1} \mid A_1 \cap A_2 \cap ... \cap A_n \mid∣A1∪A2∪...∪An∣=i=1∑n∣Ai∣−1≤i<j≤n∑∣Ai∩Aj∣+1≤i<j<k≤n∑∣Ai∩Aj∩Ak∣−...+(−1)n−1∣A1∩A2∩...∩An∣
还有一个定理叫做德·摩根定理:
∁S(A1∪A2∪...∪An)=∁SA1∩∁SA2∩...∩∁SAn\complement_S (A_1 \cup A_2 \cup ... \cup A_n)=\complement_SA_1 \cap \complement_SA_2 \cap ... \cap \complement_SA_n∁S(A1∪A2∪...∪An)=∁SA1∩∁SA2∩...∩∁SAn
当然也可以根据上述两个公式得出:
∣∁SA1∩∁SA2∩...∩∁SAn∣=∣S∣−∑i=1n∣Ai∣+∑1≤i<j≤n∣Ai∩Aj∣−∑1≤i<j<k≤n∣Ai∩Aj∩Ak∣+...+(−1)n∣A1∩A2∩...∩An∣\mid \complement_SA_1 \cap \complement_SA_2 \cap ... \cap \complement_SA_n \mid =\mid S \mid -\quad\displaystyle\sum_{i=1}^n \mid A_i \mid + \quad\displaystyle\sum_{1 \leq i < j \leq n} \mid A_i \cap A_j \mid - \quad\displaystyle\sum_{1 \leq i<j<k \leq n} \mid A_i \cap A_j \cap A_k \mid +...+(-1)^n \mid A_1 \cap A_2 \cap ... \cap A_n \mid∣∁SA1∩∁SA2∩...∩∁SAn∣=∣S∣−i=1∑n∣Ai∣+1≤i<j≤n∑∣Ai∩Aj∣−1≤i<j<k≤n∑∣Ai∩Aj∩Ak∣+...+(−1)n∣A1∩A2∩...∩An∣
那么接下来进入正题
对于一个数列所有排列的总集合 SSS,显然有 ∣S∣=n!\mid S \mid =n!∣S∣=n!。建立 nnn 个集合 A1,A2,...,AnA_1,A_2,...,A_nA1,A2,...,An,其中 Ai(1≤i≤n)A_i(1 \leq i \leq n)Ai(1≤i≤n) 代表第 iii 个数归位(或者说第 iii 个信封寄对了)所有方法的总集合,显然有 ∣Ai∣=(n−1)!\mid A_i \mid =(n-1)!∣Ai∣=(n−1)!。
而我们要求的,就是下面这一串:(因为 AiA_iAi 代表第 iii 个归位的总数,∁SAi\complement_SA_i∁SAi 就代表 iii 不归位的总数,他们的交集就是全部不归位的总数)
∣∁SA1∩∁SA2∩...∩∁SAn∣\mid \complement_SA_1 \cap \complement_SA_2 \cap ... \cap \complement_SA_n \mid∣∁SA1∩∁SA2∩...∩∁SAn∣
它等于:
∣S∣−∑i=1n∣Ai∣+∑1≤i<j≤n∣Ai∩Aj∣−∑1≤i<j<k≤n∣Ai∩Aj∩Ak∣+...+(−1)n∣A1∩A2∩...∩An∣\mid S \mid -\quad\displaystyle\sum_{i=1}^n \mid A_i \mid + \quad\displaystyle\sum_{1 \leq i < j \leq n} \mid A_i \cap A_j \mid - \quad\displaystyle\sum_{1 \leq i<j<k \leq n} \mid A_i \cap A_j \cap A_k \mid +...+(-1)^n \mid A_1 \cap A_2 \cap ... \cap A_n \mid∣S∣−i=1∑n∣Ai∣+1≤i<j≤n∑∣Ai∩Aj∣−1≤i<j<k≤n∑∣Ai∩Aj∩Ak∣+...+(−1)n∣A1∩A2∩...∩An∣
由于我们知道 ∣S∣=n!\mid S \mid =n!∣S∣=n!,∣Ai∣=(n−1)!\mid A_i \mid =(n-1)!∣Ai∣=(n−1)!,同样可以推出 ∣Ai∩Aj∣=(n−2)!\mid A_i \cap A_j \mid =(n-2)!∣Ai∩Aj∣=(n−2)!,∣Ai∩Aj∩Ak∣=(n−3)!\mid A_i \cap A_j \cap A_k \mid =(n-3)!∣Ai∩Aj∩Ak∣=(n−3)!……
上面那一串就等于:
n!−Cn1(n−1)!+Cn2(n−2)!−Cn3(n−3)!+...+(−1)nCnn0!n!-C_n^1(n-1)!+C_n^2(n-2)!-C_n^3(n-3)!+...+(-1)^nC_n^n0!n!−Cn1(n−1)!+Cn2(n−2)!−Cn3(n−3)!+...+(−1)nCnn0!
也就是:
n!−n!1!+n!2!−n!3!+...+(−1)nn!n!n!-\frac{n!}{1!}+\frac{n!}{2!}-\frac{n!}{3!}+...+(-1)^n\frac{n!}{n!}n!−1!n!+2!n!−3!n!+...+(−1)nn!n!
提取一下,就得到了最终公式:
n!(1−11!+12!−13!+...+(−1)n1n!)n!(1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}+...+(-1)^n\frac{1}{n!})n!(1−1!1+2!1−3!1+...+(−1)nn!1)
顺带一提,我差点把自己绕晕了,还是第二种方法好理解一些。
第二种:递推
我们设错排问题的函数为 fff。
已知 f1=0f_1=0f1=0,f2=1f_2=1f2=1。对于每一个 fi(i≥3)f_i(i \geq 3)fi(i≥3),都能根据如下分析进行递推:
- 首先,第 iii 个数是基于之前的错排添加的,则 iii 必然在原位。
- 数列中最多只能有 222 个归位的数,因为当有大于 222 个归位的数时,则无法通过一次交换两个数得到错排序列。
- 当序列中仅有 iii 一个数在原位时,则剩余的数构成 i−1i-1i−1 个数的错排。此时将 iii 与前面 i−1i-1i−1 个数任意一个交换即可得到错排序列,方案数为 fi−1(i−1)f_{i-1}(i-1)fi−1(i−1)
- 当序列中有两个数在原位时,则除了 iii 外,前 i−1i-1i−1 个数都可能成为第二个归位的数,设这个数为 jjj。剩下的数形成 i−2i-2i−2 个数的错排。但是,要想形成错排序列,则必须交换 iii 和 jjj,因此方案数为 fi−2(i−1)f_{i-2}(i-1)fi−2(i−1)。
综上所述,我们得到了递推公式 fi=(fi−1+fi−2)(i−1)f_i=(f_{i-1}+f_{i-2})(i-1)fi=(fi−1+fi−2)(i−1)。
1207

被折叠的 条评论
为什么被折叠?



