错排公式

来源:互联网 发布:自学编程入门教程 编辑:程序博客网 时间:2024/06/06 04:05

前言

错排公式,即把n本可区分书打乱使得每本书不在原本位置的方案数。

容斥原理得到的递推式

我在某题题解里讲过,现在复制过来。
设dp[i]表示i个元素的错排方案数。
什么意思呢?就是关于i的排列其中不存在任意的a[j]=j。
我们可以使用容斥原理:
例如dp[n],其实就是要满足n个条件——第i个条件为a[i]!=i
那么合法方案数=至少不满足0个条件-至少不满足1个条件+至少不满足2个条件-至少不满足3个条件+……
也就是
dp[n]=ni=0(1)iCin(ni)!
dp[n]=ni=0(1)in!i!(ni)!(ni)!
dp[n]=ni=0(1)in!i!
dp[n]=(1)n+n1i=0(1)in!i!
dp[n]=(1)n+nn1i=0(1)i(n1)!i!
dp[n]=(1)n+ndp[n1]

另一种递推式

如果i到了j,我们就让i向j连一条有向边。
合法的方案便是形成许多环且没有自环。
考虑dp[n],有两种可能。
在n-1的图上,n随便连一条有向边到一个结点,然后连向这个结点的结点改为连向n。相当于把n并进了这个环。n可以连向的结点有n-1种可能。
在n-2的图上,增加一个大小为2的环,除了n以外另一个点的编号未知,有n-1种可能。
于是错排公式有了另一种递推式
dp[n]=(n1)(dp[n1]+dp[n2])

0 0