1 条题解
-
0
模序列 题解
思路
令 ,。所有合法元素与 模 同余,因此可以写成 。其中 ,以后每一步把 加一或清零。
于是必须有 且能被 整除。记
问题变成构造长度为 、总和为 的 序列。序列由一个 的前缀,以及若干个 的块组成。
做法
子任务 1 可以枚举后 步选择“加一”还是“清零”,复杂度为 。
子任务 2 可以做位置动态规划。状态记录已经放置的元素数、当前 与当前总和;从每个状态转移到 或 。状态数为 ,在该子任务限制内可通过。
满分算法先计算
dp[v]:用若干个从零开始的块凑出和 所需的最少元素数。长度为 的块贡献且使用 个元素。因此
同时记录最后一个块的长度以便恢复方案。枚举第一个特殊前缀的长度 ,其贡献为
若剩余值非负且
dp[剩余值] <= n-p,就恢复这些普通块,并用长度为一、贡献为零的块补足剩余位置。最后把每个 还原成 。正确性证明
任意合法操作都保持元素模 的余数为 ,所以归一化后的转移恰为“加一”或“清零”。第一次清零前必形成从 开始的连续递增前缀;以后每两次清零之间必形成从零开始的连续递增块。反之,任意这种分块都逐项满足合法转移。
动态规划枚举了每个普通块的所有可能长度,并取实现给定和所需的最短总长度,所以
dp[v]不超过可用位置数当且仅当普通块可以放入;多余位置可由单元素零块补齐。算法又枚举了特殊前缀的全部可能长度,故若存在合法序列必会找到,所恢复序列也必合法且总和为 。复杂度
单个测试用例记归一化目标为 。动态规划复杂度为 ,枚举与输出复杂度为 ,空间复杂度为 。由输入的总和限制,总复杂度可通过。
- 1
信息
- ID
- 1439
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者