记一道DP题

题意:

给定 n l r
求长度为n的 且元素在 [l-r] 的 且 数组元素和是3的倍数的 数组的 个数

思路:

DP
mod0 表示区间内的数mod 3 = 0的个数 mod1 mod2 同理
dp[i][j] 表示 长度为i的 数组元素mod 3 为 j 的数组的个数
如果 i-1长度的数组和 mod 3 = 0 那么我再加一个 mod 3 = 0的数 整个数组 mod 3 还是等于0
如果 i-1长度的数组和 mod 3 = 1 那么我再加一个 mod 3 = 2 的数 整个数组 mod 3 就等于0了
如果 i-1长度的数组和 mod 3 = 2 那么我再加一个 mod 3 =1 的数 整个数组 mod 3 就等于0了
也就是 dp[i][0] = dp[i-1][0]*mod0+dp[i-1][1]*mod2+dp[i-1][2]*mod1
剩下两个同理
那么转移方程:

dp[i][0] = ((dp[i-1][0]*mod0)%mod+(dp[i-1][1]*mod2)%mod+(dp[i-1][2]*mod1)%mod)%mod
dp[i][1] = ((dp[i-1][0]*mod1)%mod+(dp[i-1][1]*mod0)%mod+(dp[i-1][2]*mod2)%mod)%mod
dp[i][2] = ((dp[i-1][0]*mod2)%mod+(dp[i-1][1]*mod1)%mod+(dp[i-1][2]*mod0)%mod)%mod
n,l,r = map(int,input().split())
dp = [[0,0,0] for i in range(n)]
mod  = 1000000007
mod0 = (r//3-(l-1)//3)%mod
mod1 = ((r+2)//3-(l+1)//3)%mod
mod2 = ((r+1)//3-(l)//3)%mod
dp[0][0] = mod0
dp[0][1] = mod1
dp[0][2] = mod2
print(mod1,mod2,mod0)
for i in range(1,n):
    dp[i][0] = ((dp[i-1][0]*mod0)%mod+(dp[i-1][1]*mod2)%mod+(dp[i-1][2]*mod1)%mod)%mod
    dp[i][1] = ((dp[i-1][0]*mod1)%mod+(dp[i-1][1]*mod0)%mod+(dp[i-1][2]*mod2)%mod)%mod
    dp[i][2] = ((dp[i-1][0]*mod2)%mod+(dp[i-1][1]*mod1)%mod+(dp[i-1][2]*mod0)%mod)%mod
print(dp[n-1][0])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值