P4071 [SDOI2016] 排列计数
我们先从\(n\)个数里选\(m\)个数钦定这些数满足\(a_i = i\),因此原问题就等于让\(n-m\)个数的排列满足\(a_i \neq i\)的排列方案数
先说一个错误的做法:设\(dp_i\)表示长为\(i\)的排列的方案数。我们每次枚举一个大小为\(j\)的环,可以得到递推式子:
其中\((j-1)!\)为组成一个大小为\(j\)的环的方案数,\(\binom{i}{j}\)表示从\(i\)个排列中选\(j\)个,让他们组成环
我们发现这个是不对的,比如2 1 4 3,\(\binom{i}{j}\)会同时计算钦定环为2 1和4 3的情况,这很明显会重复。寄
方法1:
正解做法:设\(dp_i\)表示长为\(i\)的排列的方案数。每次我们判断\(n\)这个数放在哪个位置:
-
放在不是\(n\)所在位置的位置,让后把这个位置删掉(因为他已经被填数了,而且这次填数没有任何环构成)
-
放在不是\(n\)所在位置的位置,并且这个位置的下标的数放在\(n\)这个位置(此时构成了一个环)
因此可以得出递推式:\(dp_i = (i-1) \times dp_{i-1} + (i-1) \times dp_{i-2}\)
思路总结:对于与环的个数有关的问题,递推式要考虑删掉环上一个没用的点或删掉一个大小为\(2\)的环的两种情况
方法2:
设\(f_i\)表示有\(\geq i\)个\(a_p = p\)的方案数,\(g_i\)表示\(= i\)个\(a_p = p\)的方案数,可以发现计算\(f_i\)是非常容易的:\(f_i = \binom{n}{i} \times (n-i)!\)
可以发现\(f_i = \sum_{j=i}^{n}{\binom{j}{i} \times g_i\),二项式反演(详情见之后写的博客)即可

浙公网安备 33010602011771号