「2020-2021 集训队作业」Yet Another Permutation Problem

考虑如何判断一个排列能否在 \(k\) 次操作内得到。

不难发现只要最长连续段长度 \(\ge n-k\) 即可。

发现这个限制很难处理,转化为求所有连续段长度都 \(<n-k\) 的方案数,然后减一减。

\(k=n-k-1\),那么求的就是所有连续段长度都 \(\le k\) 的方案数。

一个简单的想法就是每次加入一个上升段容斥,但是问题是我们不知道容斥系数。

设长度为 \(x\) 的上升段的容斥系数为 \(f(x)\),那么:

\[ans=\sum_{S} \prod_{i \in S} f(i) \dfrac{n!}{\prod_{i \in s}i!} \]

\(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\) 的一个划分,因为显然这个连续段会被被它包含的所有连续段都算到。

于是可以得到:

\[[\max_{i \in Q} i \le k]=\prod_{i \in Q} \sum_{S} \prod_{j \in S} f(j) \]

\[\prod_{i \in Q} [i \le k]=\prod_{i \in Q} \sum_{S} \prod_{j \in S} f(j) \]

尝试写出 \(f(x)\) 的生成函数 \(F(x)=\sum f(i)x^i\)

那么可以得到:

\[\prod_{i \in Q} [i \le k]=\prod_{i \in Q} [x^i](\sum F(x)^j) \]

不难发现上式成立的充分条件是 \([i \le k]=[x^i](\sum F(x)^j)\)。,我们尝试在这个条件的约束下构造 \(F\)

把左边也写成生成函数,得到:

\[\sum_{i=0}^k x^i=\sum F(x)^i \]

左边等于 \(\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)\),可以得到:

\[F(x)=1+\dfrac{x-1}{1-x^{k+1}} \]

\[F(x)=1+(x-1) \sum x^{(k+1) \times i} \]

\[F(x)=1+\sum x^{(k+1) \times i+1}-\sum x^{(k+1) \times i} \]

不难发现对于每个 \(x\)\(F(x)\) 只有 \(\Theta(\dfrac{n}{k})\) 项非零,于是直接暴力 \(\rm DP\) 即可做到 \(\Theta(n^2 \log n)\)

posted @ 2024-03-28 09:10  Tx_Lcy  阅读(59)  评论(0)    收藏  举报