1 条题解
-
0
平衡码题解
思路
先求前缀函数 :区间 中数位和为偶数的整数个数。答案就是 。
用数位 DP 从高位到低位处理 。状态只需记录已经选择的数字之和奇偶性,以及当前前缀是否仍与 相等。枚举下一位数字并更新奇偶性;所有位处理完后,只累加偶数状态。前导零不改变数位和,因此自然包含整数 。
做法
- 把 转成十进制数字序列。
- 维护受限前缀的奇偶性,并用两个计数保存已经小于 的前缀在两种奇偶状态下的方案数。
- 对每一位枚举比当前上界小的数字加入自由状态,再沿等于上界的数字继续。
- 处理完所有位后,若受限前缀为偶数则再计入它本身。
- 对每个询问输出 。
证明
每个 的定长十进制表示在第一处小于 的位置唯一进入自由状态;若始终相等,则对应 。DP 对每个位置枚举的数字恰好累加其奇偶贡献,因此所有 被不重不漏地分类到最终的奇偶状态。偶数状态的方案数正是 。两个前缀相减后恰好保留 ,所以算法正确。
复杂度
每个前缀只处理至多 19 位,每位枚举 10 个数字。每组数据时间复杂度为 ,额外空间复杂度为 。
- 1
信息
- ID
- 1006
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者