1 条题解
-
0
题解
思路
设 表示当前长度下、末项为 的好序列数量。若下一项为 ,合法条件正是 。直接枚举所有 需要二次复杂度,但固定 后,合法的 恰好是 。
做法
长度为 时,每个 都有一个序列,所以全部状态初始化为 。随后重复 层:枚举旧末项 ,再枚举不超过 的所有 的倍数 ,把 加入新状态 。每次加法都对 取模。最后对全部末项状态求和。
一层转移次数为 。
正确性证明
长度为 的初始化显然逐一表示全部合法序列。假设 正确统计了长度为 且末项为 的好序列。算法只把它转移到 的倍数 ,所以新相邻项满足整除条件;反之,任何长度为 、末项为 的好序列,删去末项后有唯一前驱末项 且 ,会由算法恰好加入一次。因此新状态正确。归纳到长度 后,对末项求和即得到全部好序列数。
复杂度分析
时间复杂度为 ,空间复杂度为 。
子任务说明
- 时递归枚举全部候选序列。
- 时枚举所有前驱与后继,做 动态规划。
- 满数据只枚举每个状态的倍数,利用调和级数优化。
- 1
信息
- ID
- 1069
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者