错排问题公式推导

错排问题

问题描述

对于一个长度为 nnn 全排列 AAA,求问有多少种 AAA 的排列,使得对于所有的整数 iii1≤i≤n1 \leq i \leq n1in,都有 Ai≠iA_i \not = iAi=i

公式推导

第一种:O(1)公式

以下内容定义 A1,A2,...,AnA_1,A_2,...,A_nA1,A2,...,Annnn 个集合,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 \midA1A2...An∣=i=1nAi1i<jnAiAj+1i<j<knAiAjAk...+(1)n1A1A2...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_nS(A1A2...An)=SA1SA2...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 \midSA1SA2...SAn∣=∣Si=1nAi+1i<jnAiAj1i<j<knAiAjAk+...+(1)nA1A2...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(1in) 代表第 iii 个数归位(或者说第 iii 个信封寄对了)所有方法的总集合,显然有 ∣Ai∣=(n−1)!\mid A_i \mid =(n-1)!Ai∣=(n1)!

而我们要求的,就是下面这一串:(因为 AiA_iAi 代表第 iii 个归位的总数,∁SAi\complement_SA_iSAi 就代表 iii 不归位的总数,他们的交集就是全部不归位的总数)

∣∁SA1∩∁SA2∩...∩∁SAn∣\mid \complement_SA_1 \cap \complement_SA_2 \cap ... \cap \complement_SA_n \midSA1SA2...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 \midSi=1nAi+1i<jnAiAj1i<j<knAiAjAk+...+(1)nA1A2...An

由于我们知道 ∣S∣=n!\mid S \mid =n!S∣=n!∣Ai∣=(n−1)!\mid A_i \mid =(n-1)!Ai∣=(n1)!,同样可以推出 ∣Ai∩Aj∣=(n−2)!\mid A_i \cap A_j \mid =(n-2)!AiAj∣=(n2)!∣Ai∩Aj∩Ak∣=(n−3)!\mid A_i \cap A_j \cap A_k \mid =(n-3)!AiAjAk∣=(n3)!……

上面那一串就等于:

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(n1)!+Cn2(n2)!Cn3(n3)!+...+(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!(11!1+2!13!1+...+(1)nn!1)

顺带一提,我差点把自己绕晕了,还是第二种方法好理解一些。
第二种:递推

我们设错排问题的函数为 fff

已知 f1=0f_1=0f1=0f2=1f_2=1f2=1。对于每一个 fi(i≥3)f_i(i \geq 3)fi(i3),都能根据如下分析进行递推:

  • 首先,第 iii 个数是基于之前的错排添加的,则 iii 必然在原位。
  • 数列中最多只能有 222 个归位的数,因为当有大于 222 个归位的数时,则无法通过一次交换两个数得到错排序列。
  • 当序列中仅有 iii 一个数在原位时,则剩余的数构成 i−1i-1i1 个数的错排。此时将 iii 与前面 i−1i-1i1 个数任意一个交换即可得到错排序列,方案数为 fi−1(i−1)f_{i-1}(i-1)fi1(i1)
  • 当序列中有两个数在原位时,则除了 iii 外,前 i−1i-1i1 个数都可能成为第二个归位的数,设这个数为 jjj。剩下的数形成 i−2i-2i2 个数的错排。但是,要想形成错排序列,则必须交换 iiijjj,因此方案数为 fi−2(i−1)f_{i-2}(i-1)fi2(i1)

综上所述,我们得到了递推公式 fi=(fi−1+fi−2)(i−1)f_i=(f_{i-1}+f_{i-2})(i-1)fi=(fi1+fi2)(i1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值