bp
def count_num(s):
a = [[0, 0, 0] for _ in range(len(s))]
a[0][int(s[0])%3] = 1
for i in range(1,len(s)):
n = int(s[i])
if n%3 == 0:
a[i][0] = a[i - 1][0] * 2 + 1
a[i][1] = a[i - 1][1] * 2
a[i][2] = a[i - 1][2] * 2
elif n%3 == 1:
a[i][0] = a[i - 1][2] + a[i - 1][0]
a[i][1] = a[i - 1][0] + a[i - 1][1] + 1
a[i][2] = a[i - 1][1] + a[i - 1][2]
elif n%3 == 2:
a[i][0] = a[i - 1][1] + a[i - 1][0]
a[i][1] = a[i - 1][2] + a[i - 1][1]
a[i][2] = a[i - 1][0] + a[i - 1][2] + 1
print(a[-1][0]%1e9+7) a[i][n] 表示i个数余数为n的子序列个数
a[i]%3 == 0 时,a[i-1][0]每一个子序列加上a[i]都成为一个新的余数为0的子序列
选择a[i], a[i][0] = a[i-1][0] + 1 (加上只选a[i]自己的一个子序列)
a[i][1] = a[i-1][1] 每个子序列都加上了a[i]
a[i][2] = a[i-1][2]
不选择a[i], a[i][0] = a[i-1][0]
a[i][1] = a[i-1][1]
a[i][2] = a[i-1][2]
选择a[i]不影响其他余数 故a[i][0] = a[i-1][0]2+1 ,a[i][1] = a[i-1][1]2, a[i][2] = a[i-1][2]*2
a[i]%3 == 1 时,a[i-1][2]每一个子序列加上a[i]都成为一个新的余数为0的子序列,a[i-1][1]每一个子序列加上a[i]都成为一个新的余数为2的子序列,
a[i-1][0]每一个子序列加上a[i]都称为一个新的余数为1的子序列
选择a[i], a[i][0] = a[i-1][2]
a[i][1] = a[i-1][0] + 1 (加上只选a[i]自己的一个子序列)
a[i][2] = a[i-1][1]
不选择a[i], a[i][0] = a[i-1][0]
a[i][1] = a[i-1][1]
a[i][2] = a[i-1][2] + 1 (加上只选a[i]自己的一个子序列)
故a[i][0] = a[i-1][2]+a[i-1][0], a[i][1] = a[i-1][0]+a[i-1][1] ,a[i][2] = a[i-1][1]+a[i-1][2]
a[i]%3 == 2 时,a[i-1][2]每一个子序列加上a[i]都成为一个新的余数为1的子序列,a[i-1][1]每一个子序列加上a[i]都成为一个新的余数为0的子序列,
a[i-1][0]每一个子序列加上a[i]都称为一个新的余数为2的子序列
选择a[i], a[i][0] = a[i-1][1]
a[i][1] = a[i-1][2]
a[i][2] = a[i-1][0]
不选择a[i], a[i][0] = a[i-1][0]
a[i][1] = a[i-1][1]
a[i][2] = a[i-1][2]
故a[i][0] = a[i-1][1]+a[i-1][0], a[i][1] = a[i-1][2]+a[i-1][1] ,a[i][2] = a[i-1][0]+a[i-1][2]

深信服公司福利 762人发布