错位排列

· · 算法·理论

求有多少 1 \sim n 的排列 p 满足 p_i \ne i

递推

d_n 表示答案。我们考虑 n - 1n 的排列的关系。

这样思考。假如此时我们已经获得了一个 n - 1 的排列。现在在这个排列的后面添加一个值 n。这就是一个 n 的排列。

显然此时这个排列并不是错位排列,因为 p_n = n。我们尝试将 p_n 和某个 p_i1 \le i \le n - 1) 交换,并希望交换这一次后新排列是一个错位排列。

此时分类讨论:

综上 d_n = (n-1)d_{n-1} + (n-1)d_{n-2} = (n-1)(d_{n-1} + d_{n - 2})

容斥

对于这种限制类的问题,直接考虑容斥。 若我们能求出:$f(i)$ 表示有多少个 $n$ 的排列,存在**至少** $i$ 个 $p_j \ne j$($1 \le j \le n$),那么容斥就有: $$ d_n = f(0) - f(1) + f(2) - f(3) + \dots $$ 形式化即: $$ d_n = \sum_{i=0}^n (-1)^i f(i) $$ 考虑求解 $f(i)$。 考虑一般的 $i$。我们给 $f(i)$ 的定义里写存在**至少** $i$ 个 $p_j \ne j$,那不妨我们先把这 $i$ 个找出来。有 $\dbinom ni$ 种选择。对于剩下的 $n - i$ 个位置,我们对其不做限制,因为即使不做限制,我们也能保证错误的位置至少有刚才选出的 $j$ 个。即剩下的位置有 $(n - i)!$ 种方案。 于是: $$ f(i) = \dbinom ni (n-i)! = \dfrac{n!}{i!(n-i!)} \cdot (n-i)! = \dfrac{n!}{i!} $$ 因此: $$ d_n = \sum_{i=0}^n (-1)^i f(i) = \sum_{i=0}^n (-1)^i \dfrac{n!}{i!} $$ ## 二项式反演 令 $f(n)$ 表示有恰好 $n$ 个位置填错的方案数,也就是答案。 考虑设 $g(n)$ 表示有至多 $n$ 个位置填错的方案数。不难发现 $g(n) = n!$。 考虑 $f, g$ 的关系: $$ g(n) = \sum_{k=0}^n \dbinom nk \times f(k) $$ 二项式反演得: $$ \begin{aligned} f(n) &=\sum_{k=0}^n \dbinom nk(-1)^{n-k}g(k) \\ &= \sum_{k=0}^n\dbinom nk(-1)^{n-k}k! \\ &= \sum_{k=0}^n \dfrac{(-1)^{n-k}n!}{(n-k)!} \\ &= \sum_{k=0}^n \dfrac{(-1)^k n!}{k!} \end{aligned} $$