【P7438】更简单的排列计数

· · 题解

本题解提供一种无需生成函数的做法。

:以下所有排列 \pi 均为错排,|\pi| 表示排列 \pi 的长度。

c_{n,i}=\sum_\pi[|\pi|=n][\text{cyc}_ \pi=i],即在长度为 n 的错排中,恰能分解为 i 个循环的排列个数。先列个关于 c_{n,i} 的表:

n,i 1 2 3
2 1
3 2
4 6 3
5 24 20
6 120 130 15

不难发现 c_{n,i}=(n-1)(c_{n-1,i}+c_{n-2,i-1}),以下证明:

对长度为 n 的排列 \pi 的最后一个数所在循环长度进行分类讨论:

\begin{pmatrix}1&2&3&4\\2&4&1&3\end{pmatrix}\rightarrow\begin{pmatrix}1&2&3\\2&3&1\end{pmatrix}

综上,方案数为 c_{n,i}=(n-1)(c_{n-1,i}+c_{n-2,i-1})

再看题目要求,记 \text{Ans}_ m=\sum_{|\pi|=m}F(\text{cyc}_ \pi)F(x)=\sum_if_ix^i

若直接展开 F(\text{cyc}_ \pi) 则得:

\begin{aligned} \text{Ans}_ m&=\sum_{j}f_j\sum_{|\pi|=m}(\text{cyc}_ \pi)^j\\ &=\sum_{j}f_j\sum_ic_{m,i}\,i^j \end{aligned}

b_{m,j}=\sum_ic_{m,i}\,i^j,可以证明有递推式:

b_{m,j}=(m-1)(b_{m-1,j}+\sum_{i=0}^j\binom jib_{m-2,i})

但是要是这样递推下去,时间复杂度是 O(n^3) 的,不如不要。

考虑采用 P4827 中的方法,用第二类斯特林数展开普通幂。因为:

m^n=\sum_{i=0}^ni!\binom mi\begin{Bmatrix} n \\i \end{Bmatrix}

所以可以用这个东西展开 (\text{cyc}_ \pi)^j,代入原式有:

\begin{aligned} \text{Ans}_ m&=\sum_{j=0}^{k-1}f_j\sum_{|\pi|=m}\sum_{i=0}^ji!\binom {\text{cyc}_ \pi}i\begin{Bmatrix} j \\i \end{Bmatrix}\\ &=\sum_{i=0}^{k-1}\Bigg(i!\sum_{j=i}^{k-1}f_j\begin{Bmatrix} j \\i \end{Bmatrix}\Bigg)\sum_{|\pi|=m}\binom {\text{cyc}_ \pi}i \end{aligned}

p_{m,i}=\sum_{|\pi|=m}\binom{\text{cyc}_ \pi}{i},列表观察:

m,i 0 1 2
2 1 1 0
3 2 2 0
4 9 12 3
5 44 64 20

发现 p_{m,i}=(m-1)(p_{m-1,i}+p_{m-2,i}+p_{m-2,i-1}),以下证明:

\begin{aligned} p_{m,i}&=\sum_{|\pi|=m}\binom{\text{cyc}_ \pi}i\\ &=\sum_{j}\binom jic_{m,j}\\ &=(m-1)\sum_{j}\binom ji(c_{m-1,j}+c_{m-2,j-1})\\ &=(m-1)\Big(p_{m-1,i}+\sum_{j}\binom {j-1}{i}c_{m-2,j-1}+\sum_{j}\binom {j-1}{i-1}c_{m-2,j-1}\Big)\\ &=(m-1)(p_{m-1,i}+p_{m-2,i}+p_{m-2,i-1}) \end{aligned}

证毕,则可在 O(nk) 的时间内把所有的 p_{m,i}(m\le n, i<k) 求出。

关于 i!\sum_{j=i}^{k-1}f_j\begin{Bmatrix} j \\i \end{Bmatrix} 这一部分,可以暴力 O(k^2) 求出。

至此,本题可在 O(nk+k^2) 的时间复杂度内完成。