ZR2504 题解
题意
对于一个 \(1\sim n\) 的排列 \(a\) 和一个数 \(m\),定义 \(f(a,m)\) 为恰好经过 \(m\) 轮冒泡排序后变为 \(a\) 的不同排列数量。
给定 \(n,m\) 和一个长度为 \(n\) 的序列 \(lim\)。一个排列合法当且仅当 \(\forall i\),如果 \(lim_i\neq0\),那么 \(a_i=lim_i\)。
你需要求出所有合法的 \(a\) 的 \(f(a,m)\) 之和。答案对 \(998244353\) 取模。
\(1\le n\le5\times10^3,0\le m\le n\)。
题解
先考虑 \(a\) 确定时如何计算 \(f(a,m)\)。
令原排列为 \(a'\)。令 \(pos_i\) 表示 \(i\) 在 \(a'\) 中的位置,\(b'_i\) 表示 \(i\) 左边大于 \(i\) 的数的数量,即 \(b'_i=\sum\limits_{j=1}^{pos_i-1}[a'_j>i]\)。同理定义 \(b\)。易知 \(b'\) 与 \(a'\) 一一对应。以下对 \(b'\) 计数。
\(m\) 次操作后,\(b'_i\) 变为 \(\max(b'_i-m,0)\)。于是若 \(b_i>0\),\(b'_i\) 是确定的;否则有 \(m+1\) 种可能。注意到 \(b'_i\in[0,n-i]\),则当 \(i\ge n-m+1\) 时,只有 \(n-i+1\) 种可能。
于是当 \(a\) 合法(容易判定)时,答案为 \((m+1)^tm!\),其中 \(t=\sum\limits_{i=1}^{n-m}[b_i=0]\)。也就是 \(a\) 中前缀最大值为其本身的位置个数。
\(a\) 不确定时,套上一个 \(\text{dp}\) 即可。复杂度 \(O(n^2)\)。

浙公网安备 33010602011771号