题解

cookiebus 2023-10-19 8:51:36 2023-10-19 9:00:59 12 返回题目

这个问题可以通过动态规划解决。具体来说,问题中的一个"好的01串"可以被视为一系列连续的0和1的集合,其中每个集合都必须满足一定的条件:它们必须由连续的 个1或者 个0组成,然后基于此再追加连续的 个1或者 个0。

让我们定义状态 为长度为 的好的信号串的数量。

主要思路

  1. 初始化:设定 为1,代表一个长度为0的好的信号串只有一个,即空串。

  2. 状态转移:对于每一个长度为 的信号串,它可以由长度为 的好的信号串后面追加 个0或 个1得到。因此, 的值可以从 转移得到。需要注意的是,当 为0时,对应的长度 的信号串不应该被计入。

  3. 求解:最后,我们将长度在 之间的所有信号串的数量求和,这就得到了最终的答案。

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[100005];
ll mod = 1e9 + 7;
ll solve(int l, int r, int x, int y)
{
    dp[0] = 1;
    for (int i = 1; i <= r; i++)
    {
        if (i >= x)
        {
            dp[i] = (dp[i] + dp[i - x]) % mod;
        }
        if (i >= y)
        {
            dp[i] = (dp[i] + dp[i - y]) % mod;
        }
    }
    ll sum = 0;
    for (int i = l; i <= r; i++)
        sum = (sum + dp[i]) % mod;
    return sum;
}
int main()
{
    int l, r, x, y;
    cin >> l >> r >> x >> y;
    if (x > y)
        swap(x, y);
    cout << solve(l, r, x, y) << endl;
}
{{ vote && vote.total.up }}