「2020-2021 集训队作业」Yet Another Permutation Problem
考虑如何判断一个排列能否在 \(k\) 次操作内得到。
不难发现只要最长连续段长度 \(\ge n-k\) 即可。
发现这个限制很难处理,转化为求所有连续段长度都 \(<n-k\) 的方案数,然后减一减。
令 \(k=n-k-1\),那么求的就是所有连续段长度都 \(\le k\) 的方案数。
一个简单的想法就是每次加入一个上升段容斥,但是问题是我们不知道容斥系数。
设长度为 \(x\) 的上升段的容斥系数为 \(f(x)\),那么:
\(S\) 就表示 \(n\) 的一个划分。
接着问题就是求出 \(f(x)\)。
不妨统计某个排列 \(P\) 在等式两边的贡献,设 \(P\) 的连续段划分为 \(Q\)。
那么 \(P\) 在左边的贡献就是 \([\max_{i \in Q} i \le k]\),在右边的贡献就是 \(\prod_{i \in Q} \sum_{S} \prod_{j \in S} f(j)\),其中 \(S\) 是 \(i\) 的一个划分,因为显然这个连续段会被被它包含的所有连续段都算到。
于是可以得到:
尝试写出 \(f(x)\) 的生成函数 \(F(x)=\sum f(i)x^i\)。
那么可以得到:
不难发现上式成立的充分条件是 \([i \le k]=[x^i](\sum F(x)^j)\)。,我们尝试在这个条件的约束下构造 \(F\)。
把左边也写成生成函数,得到:
左边等于 \(\dfrac{x^{k+1}-1}{x-1}\),右式等于 \(\dfrac{1}{1-F(x)}\)。
那么可以得到 \(F(x)=\dfrac{x-x^{k+1}}{1-x^{k+1}}\)。
暴力展开 \(F(x)\),可以得到:
不难发现对于每个 \(x\),\(F(x)\) 只有 \(\Theta(\dfrac{n}{k})\) 项非零,于是直接暴力 \(\rm DP\) 即可做到 \(\Theta(n^2 \log n)\)。

浙公网安备 33010602011771号