#sWDPybttg050304. 1588:数字游戏
1588:数字游戏
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 为 。现在大家又要玩游戏了,指定一个整数闭区间 ,问这个区间内有多少个取模数。
输入格式
题目有多组测试数据。每组只含三个整数 。
输入以文件结束(EOF)为终止。
输出格式
对于每组测试数据,输出一行,表示各位数字和 为 的数的个数。
样例
样例输入
1 19 9
样例输出
2
样例解释
,要求各位数字和能被 整除。
在 中:
- 数字 :各位和 ,符合;
- 数字 :,符合;
- 其他数字各位和 mod 9 不为 0,如 和为 1, 和为 2,等等。
所以共 个取模数。
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题为 数位 DP 问题。
状态设计: 表示处理到第 位(从高位到低位),当前各位数字之和模 为 时的方案数。
转移:枚举当前位数字 从 到 (若有限制则到 ),更新 。
初始状态:,其中第一个 true 表示受上限限制,第二个 true 表示前面全是前导零(但这里前导零不影响数字和,可以忽略)。
最终要求 ,且排除数字 (如果 则不影响,但若区间包含 , 的数字和为 模 为 ,需要根据题意判断是否算取模数。一般题目中取模数是正整数,所以 不算)。
具体实现:
- 将数字 拆成数位数组;
- DFS(pos, sum_mod, limit, lead):
- pos:当前位;
- sum_mod:当前数字和模 ;
- limit:是否受上限限制;
- lead:是否前面全是前导零。
- 记忆化:, 和 不记忆,但当 且 时记忆化。
- 当 pos 到达末尾时,如果 lead 为真,则返回 0(排除数字 0),否则返回 sum_mod==0 ? 1 : 0。
- 转移:枚举当前位数字,如果 lead 为真且 d==0,则继续 lead 为真;否则 lead 变为假。
最终答案为:calc(b) - calc(a-1)。
复杂度:状态数 ,,位数不超过 10( 约 10 位),可以快速计算。
注意: 可能为 1,此时所有数都符合,但要注意区间内数字个数计算。