错排问题的通项公式
我们定义错排数 \(d_n\) 为满足下条件的排列的数目:排列的长度为 \(n\) 且不存在 \(i\) 使得 \(p_i=i\)。在此避开对 \(d_0\) 的讨论。它的递推式是 trivial 的:
并且显然有 \(d_1 = 0, d_2 = 1\)。
直接通过递推式求解通项公式是困难的(对笔者来说),《具体数学》中给出了另一个办法如下。
根据容斥原理,我们可以直接写出 \(d_n\) 的表达式:
其中第 \(k\) 项表示:从 \(n\) 个位置中选出 \(k\) 个,钦定它们排列正确;剩下 \((n-k)\) 个可以随便乱排;最后乘上容斥系数 \((-1)^k\)。(个人习惯:用 \(\binom{m}{n}\) 表示 \(C_m^n\)。)(当然,这个表达式也可以通过二项式反演得到。)
化简这个式子:
观察后面的式子,可以联想到 \(e^x\) 的 Maclaurin 展开式,即:
在 \((2)\) 式中取 \(x=-1\) ,得到:
这与 \((1)\) 的形式类似,于是我们希望用 \((3)\) 来表示 \((1)\) 。这引导我们分析两个式子的差的大小:
括号中的量可以轻易地用裂项的方法得到:它介于 \(1-\frac 1 {n+2} = \frac {n+1}{n+2}\) 和 \(1\) 之间。于是, \(n!/e\) 和 \(d_n\) 的差大约是 \(1/n\);更精确地,它介于 \(1/(n+1)\) 和 \(1/(n+2)\) 之间。
然而, \(d_n\) 是一个整数。所以,如果 \(n>0\),那么 \(d_n\) 必定就是我们将 \(n!/e\) 四舍五入之后的整数。而一个简单的表示四舍五入的方法是加上 \(0.5\) 之后向下取整;于是,这样就求出了我们想要的封闭形式:
然而,这个公式并没有很大的实用价值,因为一般情况下 \(n!\) 的求值依然有着至少 \(O(n)\) 的复杂度。