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。

浙公网安备 33010602011771号