由于总误差不超过 ,每一项都满足 。因为 且 ,所有可能的音高均在 到 的范围内。该范围包含 个整数。
设 表示确定前 项后,总误差恰好为 ,且最后一个音高 为 的序列数量。只保存满足 、 的状态。
第一个音高固定为 ,因此第一项的误差为 。若 ,则初始化
其余状态均为 。若 ,则不存在合法序列,可以直接输出 。
现在设 ,并将最后一个音高选为 。这一项的误差为 ,因此前 项的总误差必须为 。前一个音高 必须满足 ,所以当 时,
当 时,该状态的值为 。
按照 的顺序,枚举每个误差 和最后一个音高 ,再直接枚举上述区间内的 并求和。所有加法均对 取模。
最终答案为
应当将误差不超过 的所有状态相加,而不是只统计误差恰好为 的状态。
共有 个状态,每个状态最多检查 个前一个音高。因此,时间复杂度为
这些因子分别对应元素个数 × 音高范围 × 总误差范围 × 相邻音高差范围。在给定限制下,可以直接计算这些转移。
每一步只使用紧接着的上一步,所以只需保存两层数组。空间复杂度为 。将音高 对应到数组下标 即可。
证明
第一项唯一确定为 ,其误差为 。因此,在 时设置 ,恰好统计了唯一合法的长度为 的序列。若 ,后续项无法减小总误差,因此答案为 。
Solution written by GPT6
假设 正确。从一个最后音高为 、总误差为 的合法序列中删除最后一项后,得到的先前序列的误差为 ,且其最后音高 满足 。
反过来,在这样的先前序列末尾添加 ,就能满足相邻音高差的条件,且总误差恰好为 。这两个过程互为逆过程,因此该转移不重不漏地统计了所有合法序列。最后将满足 的所有状态相加,即可得到所求答案。