Baby Ehab Plays with Permutations | Codeforces 1516E
给定 \(n,k\),对于每个 \(i \in [1,k]\),你需要求出有多少个长度为 \(n\) 的排列能通过恰好 \(i\) 次交换操作变成 \(\{1,2,\cdots,n\}\)。
答案对 \(10^9+7\) 取模。
\(n \le 10^9,k \le 200\)
先考虑这样一个问题:给定一个排列 \(P\),最少交换几次才能变成 \(\{1,2,\cdots,n\}\)。
把排列 \(P\) 理解成一个置换,并分解成循环,不难发现 \(i\) 个元素的循环需要交换 \(i-1\) 次。
这样,如果 \(P\) 的循环节为 \(x\),则总的交换次数为 \(n-x\)。
涉及到点数和循环数不难想到第一类斯特林数。
\(i\) 的答案即 \({n \brack n-i}+{n \brack n-i+2}+{n \brack n-i+4} + \cdots\)。
问题是 \(n\) 太大了,不能递推求出第一类斯特林数。
由于 \(i\) 次交换最多影响 \(2i\) 个元素,一个合法的排列 \(P\) 至多有 \(2i\) 个位置 \(j\) 满足 \(j \ne P_j\)。
可以枚举有多少个 \(j\) 满足 \(j \ne P_j\),如果有 \(x\) 个,对答案的贡献为 \(\binom nxf_{x,x-i}\)。
其中 \(f_{i,j}\) 表示有多少个长度为 \(i\) 的错排循环节为 \(j\),它可以通过第一类斯特林数容斥得到: \[ f_{i,j}={i \brack j}-\sum_{k=1}^j\binom ikf_{i-k,j-k} \] 复杂度 \(O(k^3)\)。
代码:
1 |
|