1 条题解
-
0
题解:黏液与序列(简单版)
思路
一、从好序列到欧拉数
记 为欧拉数:长度为 的排列中,恰有 个下降位置的排列数。 取约定 ,越界时为 。它满足
对原问题作标准的插入位置计数,可以得到数字 的总出现次数为
$$\operatorname{Ans}_n(k)=n!\sum_{m=k}^{n}\frac{E(m,k-1)}{m!}.$$因此只需逐行计算欧拉数,并把第 行按 加入答案。
做法
二、子任务 1:直接枚举
当 时,枚举所有 个取值在 的序列。对每个出现的 ,检查是否存在更早的 ;合法时累计各值出现次数。
复杂度为 ,只适用于第一个子任务。
三、子任务 2:容斥计算欧拉数
欧拉数也有显式公式
$$E(m,k-1)=\sum_{t=0}^{k}(-1)^t\binom{m+1}{t}(k-t)^m.$$预处理组合数和阶乘后,按公式计算每个 ,再代入答案式。直接实现的 复杂度为 ,空间复杂度为 ,可通过 。
四、满分算法:滚动欧拉数 DP
令
$$\text{ndp}[k]=(m-k+1)\text{dp}[k-1]+k\text{dp}[k].$$dp[k]表示当前行的 。从上一行转移到长度 时:每得到一行,就执行
最后输出 。所有运算均在模 下进行,逆阶乘由费马小定理 预处理。
时间复杂度为 ,空间复杂度为 。
复杂度
- 子任务 1: 时间, 空间。
- 子任务 2: 时间, 空间。
- 满分算法: 时间, 空间。
五、正确性证明
引理 1
长度为 、恰有 个下降位置的排列数满足上述欧拉数递推。
证明。 把最大元素插入长度为 的排列。若原排列有 个下降位置, 有 个插入位置会新增一个下降;若原排列已有 个下降位置,有 个插入位置保持下降数不变。两类互斥且覆盖全部情况。证毕。
引理 2
原题数字 的答案为 。
证明。 按决定好序列中相邻值首次/末次相对次序的有效位置集合分类。固定有效 位置数 后,其相对次序与恰有 个下降的排列一一对应,共 种;未固定的 个位置可插入,贡献系数为 。对所有 求和即得结论。证毕。
定理
满分算法输出所有 的正确答案。
证明。 由引理 1,滚动 DP 精确计算每个 ;算法在第 行加入 ,所以循环结束时 恰为引理 2 中的和。最后乘以 ,得到 所求答案。证毕。
- 1
信息
- ID
- 1233
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者