Description
给定 $l$ 和 $r\ \left( 1 \leq l \leq r \leq 10^{18} \right)$,求区间 $[l,r]$ 中各位数字之和能整除原数的数的个数。
Source
Solution
考虑 数位DP 。
用 $f_{pos,sum,now}$ 表示当前到了第 $len - pos + 1$ 位,这些数位的和是 $sum$,模 $mod$ 的值为 $now$ 的数的个数。
可以枚举 所有数位的和 的值,这个值显然不会超过 $9\lg n$(这个值在每一位都是 $9$ 时最大)。我们把这个值当做模数 $mod$,当前数每增加一位时,我们统计各个数位的和 $sum$,并将新的数对 $mod$ 取模。当搜到最后一位时,如果模数为 $0$,那么满足条件整除;如果 $sum = mod$,那么满足 此时所有数位的和 = 枚举的所有数位的和 。如果上述两个条件都满足,则说明这个数符合题意。同时因为只需要统计 各个数位和 以及 数对 $mod$ 取模的值,所以不需要判前导零。具体实现过程详见代码,时间复杂度为 $O(9^3n\lg^3 n)$ 。
Code
1 |
|