CF886E题解

Maximum Element

总结

正难则反,分拆状态。

题意

给定一个函数,它会在找到一个大于后面 \(k\) 个数返回,求用这个函数找一个长度为 \(n\) 的排列的最大值有多少种错误的方案。

题目解析

首先我们考虑找错误的(即一个非 \(n\) 的数大于后面 \(k\) 个数),发现它很难,于是正难则反,考虑正确的有多少个,然后用全排列减。
那么看到 \(n \le 10^6\),考虑线性 dp,拆分状态,因为如果前面已经记录了最大值 \(n\),那么求到的就一定是对的。于是我们考虑枚举最大值的位置 \(i = 1 \sim n\),并 dp 求出满足到第 \(i\) 位还没有跳出的方案数,然后乘上选 \(i-1\) 个数放在 \(i\) 前面,后面 \(n-i\) 个位置随便放的方案数即可。答案为:

\[\sum_{i=1}^n f_{i-1} \begin{pmatrix}n-1 \\ i-1\end{pmatrix} (n-i)! \]

现在我们来求 \(f_i\),定义上 \(f_i\) 是到第 \(i\) 位还没有跳出的方案数,那么既然它没有跳出,那么最大值 \(i\) 一定在最后 \(k\) 位里面,此时我们枚举最大值的位置,选 \(j-1\) 个数放在 \(j\) 前面,其他放后面:

\[f_i=\sum_{j=i-k+1}^{i} f_{j-1} \begin{pmatrix}i-1 \\ j-1\end{pmatrix} (i-j)! \]

推一下式子:

\[\begin{aligned} f_i&=\sum_{j=i-k+1}^{i} f_{j-1} \begin{pmatrix}i-1 \\ j-1\end{pmatrix} (i-j)! \\ &=\sum_{j=i-k+1}^{i} f_{j-1} \frac{(i-1)!}{(j-1)!(i-j)!} (i-j)! \\ &=(i-1)!\sum_{j=i-k+1}^{i} \frac{f_{j-1}}{(j-1)!} \\ &=(i-1)!\sum_{j=i-k}^{i-1} \frac{f_{j}}{j!} \end{aligned} \]

显然可以前缀和优化 dp。

posted @ 2026-10-13 20:18  tidewave  阅读(9)  评论(0)    收藏  举报