组合数学——错序排列
问题:有5个编号的箱子和5个编号的苹果,现在要把这5个苹果放进5个箱子里,每个箱子放一个,问有多少种放法使得每个箱子的编号和其内部苹果编号不相同。形式化地讲,设集合 PPP 表示每个箱子 iii 内苹果编号是PiP_iPi,问有多少种PPP满足 ∀i,Pi≠i\forall i,P_i\neq i∀i,Pi=i 。
方法一:递推
为方便书写,规定“放错”即 Pi≠iP_i\neq iPi=i ,“放对“反之。
不难想到设 FnF_nFn 表示 nnn 个箱子按题目要求放 nnn 个苹果的方案数。
考虑新放一个苹果,放在哪里不好说,所以姑且将它放在新箱子里,然后与前面一个交换。
那么可以从两种情况转移:
-
前 n−1n-1n−1 个都“放错“。那么第 nnn 个苹果和前 n−1n-1n−1 个苹果任意一个交换都是合法的,即有 n−1n-1n−1 种选择,所以可以从 Fn−1×(n−1)F_{n-1}\times(n-1)Fn−1×(n−1) 转移。
-
前 n−1n-1n−1 个至少有一个“放对“。但是会发现如果有超过一个“放对“,需要至少两次的交换,那么就会重复计数。
所以这种情况等价于前 n−1n-1n−1 个仅有一个“放对“。
我们的新苹果必须要跟那个“放对”的苹果交换,也就是只有一种可能。问题在于这种情况下的长度为 n−1n-1n−1 的序列有多少种。
问题变得朴素许多。先将 n−2n-2n−2 个苹果错序排好,即有 Fn−2F_{n-2}Fn−2 种序列。再加入一个“放对”的苹果,有 n−1n-1n−1 个空位,故有 n−1n-1n−1 种放法,所以此情况可以从 Fn−2×(n−1)F_{n-2}\times (n-1)Fn−2×(n−1) 转移。
综上,得出递推式 Fn=Fn−1×(n−1)+Fn−2×(n−1)=(n−1)(Fn−1+Fn−2)F_n=F_{n-1}\times(n-1)+F_{n-2}\times(n-1)=(n-1)(F_{n-1}+F_{n-2})Fn=Fn−1×(n−1)+Fn−2×(n−1)=(n−1)(Fn−1+Fn−2) 。
方法二:容斥原理
未知