P4071 [SDOI2016] 排列计数

发布时间 2023-09-12 19:55:55作者: FOX_konata

原题

\[\huge{\color{#ff0000}{\text{被XJK搏杀了,我tcl}}} \]

我们先从\(n\)个数里选\(m\)个数钦定这些数满足\(a_i = i\),因此原问题就等于让\(n-m\)个数的排列满足\(a_i \neq i\)的排列方案数

先说一个错误的做法:设\(dp_i\)表示长为\(i\)的排列的方案数。我们每次枚举一个大小为\(j\)的环,可以得到递推式子:

\[dp_i = \sum_{j=2}^{i}{ dp_{i-j} \times (j-1)! \times \binom{i}{j} } \]

其中\((j-1)!\)为组成一个大小为\(j\)的环的方案数,\(\binom{i}{j}\)表示从\(i\)个排列中选\(j\)个,让他们组成环

我们发现这个是不对的,比如2 1 4 3,\(\binom{i}{j}\)会同时计算钦定环为2 1和4 3的情况,这很明显会重复。寄


正解做法:设\(dp_i\)表示长为\(i\)的排列的方案数。每次我们判断\(n\)这个数放在哪个位置:

  1. 放在不是\(n\)所在位置的位置,让后把这个位置删掉(因为他已经被填数了,而且这次填数没有任何环构成)

  2. 放在不是\(n\)所在位置的位置,并且这个位置的下标的数放在\(n\)这个位置(此时构成了一个环)

因此可以得出递推式:\(dp_i = (i-1) \times dp_{i-1} + (i-1) \times dp_{i-2}\)

思路总结:对于与环的个数有关的问题,递推式要考虑删掉环上一个没用的点或删掉一个大小为\(2\)的环的两种情况

\[\huge{\color{#ff0000}{\text{被xjk搏杀了,我tcl}}} \]