1 条题解
-
0
题意
维护一个集合 ,表示后缀的数 组成的集合。称集合 为当前状态,初始为空集。
每次打字等同于随机选择 ,令 。其中集合 表示打字后的集合,并称 为后继状态。
可以得到 $\text{nxt} = \bigcup \limits_{i \in S \cup \{0\}} (i \cdot B + t) \bmod k$。
目标是使得 。求达成目标的期望次数。
方程式
设 表示当前集合为 时还需的期望次数。则当 时,;否则
$$f(S) = 1 + \dfrac{1}{B} \sum_{t \in [0, B - 1]} f(\text{nxt}) $$当 相同时 相同。所以合并这些状态得到
$$f(S) = 1 + \dfrac{1}{B} \sum_{t \in [0, k - 1]} \left \lfloor \dfrac{B + k - 1 - t}{k} \right \rfloor \cdot f(\text{nxt}) $$算法 :
当 时, 与 无关。
目标转化为 ,每次打字完成目标的概率为 。
设 ,则 ,解得 ,即答案为 。
时间复杂度:
算法 :
结论:在达到目标前 单调递增,其中 表示集合 的元素个数。
证明:因为逆元存在,所以对于任意 , 和 一一对应。
如果 ,则 $\left | \bigcup \limits_{i \in S \cup \{0\}} (i \cdot B + t) \right | = |S \cup \{0\}| = |S| + 1$。
即在达到目标前 随每次打字增加 。所以可以按照 降序进行 DP。
优化:用位运算加速计算 的过程。这可以使复杂度减少一个 的因子。
时间复杂度:
算法 :
结论:最多只有 种可能的 。
证明:对于任意 , 是 的倍数。
即 的元素减去 的集合一定是所有 的倍数组成集合的子集,有 种可能。
加上 后乘以 即得到答案。以上只是理论上界,实际(不包含 的)可能的 的状态数是一个更小的值。
所以可以直接列出转移方程,再用高斯消元解方程组。
优化:只计算本质不相同的 。定义“本质不相同”为 不相同(,且 也“本质不相同”)。因为本质相同的 的答案一定相同,故可以合并为同一状态。
优化:在高斯消元时只计算非零项。因为矩阵较稀疏,可以跳过许多零,从而减少复杂度。
优化(来自验题人):在解方程时将转移关系建图,在用 tarjan 缩点后每个强连通分量的点中高斯消元,点之间的 DAG 则直接 DP。
时间复杂度:, 为状态数
子任务
结合算法 及优化可以通过 为 或质数的测试点。
结合算法 及优化可以通过所有测试点。
- 1
信息
- ID
- 151
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 28
- 已通过
- 2
- 上传者