关于这种比较小的模数计数,一般可以给dp多加一个状态,也就是当前的数模特定值之后为多少。
对于本题,我们可以定义定义代表了从前
位中选出的数模
后值为
,那么有如下状态转移方程:
- 情况1,不选当前数:
- 情况2,选当前数:
,其中
是第
位数的值。
其中basecase为,其他
.
需要特别注意的是,空数组的值也为0,最后需要扣掉。
import sys
if __name__ == '__main__':
s = input().strip()
n = len(s)
MOD = 10 ** 9 + 7
f = [[0] * 9 for _ in range(n + 1)]
f[0][0] = 1
for i in range(n):
for j in range(9):
f[i + 1][j] = f[i][j]
f[i + 1][j] = (f[i + 1][j] + f[i][(j - int(s[i])) % 9]) % MOD
print(f[n][0] - 1)