CF474D Flowers
我们把白花和红花想成 01,\(\text{RWWR}\) 变成 01 串,则题意抽象出来是:一个 01 串是好的,当且仅当任意连续 0 段长度为 \(k\) 的倍数。\(t\) 次询问,所有长度在 \(a_i,b_i\) 之间的 01 串中有多少个是好的。\(t,k,a_i,b_i\le 10^5\)。
如果能知道长度为 \(i\) 的 01 串有多少个是好的,我们可以做一个前缀和,\(O(1)\) 查询。
想到可以动态规划,设 \(dp_i\) 表示长度为 \(i\) 的 01 串有多少个是好的。考虑转移:
- 如果第 \(i\) 位填 1,则 \(dp_i = dp_{i-1}\);
- 如果第 \(i\) 位填 0,则最后 \(k\) 个数都是 0 才能是好的,\(dp_i=dp_{i-k}\)。
得到转移方程 \(dp_i=dp_{i-1}+dp_{i-k}\)。考虑边界条件:所有 \(i<k\) 的 01 串如果要是好的,只能全部填 1,所以 \(dp_{i<k}=1\)。
t, k = map(int, input().split())
mod = 10**9 + 7
n = 10**5
dp = [0] * (n + 1)
for i in range(0, k):
dp[i] = 1
for i in range(k, n + 1):
dp[i] = (dp[i - 1] + dp[i - k]) % mod
for i in range(1, n + 1):
dp[i] += dp[i - 1]
dp[i] %= mod
for i in range(t):
a, b = map(int, input().split())
print((dp[b] - dp[a - 1]) % mod)

浙公网安备 33010602011771号