codeforces-474D-Flowers

codeforces-474D-Flowers

                    time limit per test1.5 seconds      memory limit per test256 megabytes

We saw the little game Marmot made for Mole’s lunch. Now it’s Marmot’s dinner time and, as we all know, Marmot eats flowers. At every dinner he eats some red and white flowers. Therefore a dinner can be represented as a sequence of several flowers, some of them white and some of them red.

But, for a dinner to be tasty, there is a rule: Marmot wants to eat white flowers only in groups of size k.

Now Marmot wonders in how many ways he can eat between a and b flowers. As the number of ways could be very large, print it modulo 1000000007 (109 + 7).

Input
Input contains several test cases.

The first line contains two integers t and k (1 ≤ t, k ≤ 105), where t represents the number of test cases.

The next t lines contain two integers ai and bi (1 ≤ ai ≤ bi ≤ 105), describing the i-th test.

Output
Print t lines to the standard output. The i-th line should contain the number of ways in which Marmot can eat between ai and bi flowers at dinner modulo 1000000007 (109 + 7).

input
3 2
1 3
2 3
4 4
output
6
5
5

Note
For K = 2 and length 1 Marmot can eat (R).
For K = 2 and length 2 Marmot can eat (RR) and (WW).
For K = 2 and length 3 Marmot can eat (RRR), (RWW) and (WWR).
For K = 2 and length 4 Marmot can eat, for example, (WWWW) or (RWWR), but for example he can’t eat (WWWR).

题目链接:cf-474D

题目大意:问存在多少种,长度为n及小于n的序列满足条件:k个W一组

题目思路:dp。刚开始我的思路是dp[i][j],表示长度为i,j组k长度的W的个数。发现爆空间。
改成dp[i]一维的。有两种情况:1.dp[i] = dp[i - 1]增加一个R,2.dp[i] = dp[i - k]增加一组W。
另外需要注意,答案相减取余时可能是负数。

以下是代码:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
#define MOD 1000000007
int dp[100001]; 
int t,k;
//int ans[100010];
void solve()
{
    dp[0] = 1;
    for (int i = 1; i <= 100000; i++)
    {
        dp[i] = dp[i - 1];
        if (i >= k) dp[i] += dp[i - k]; 
        dp[i] %= MOD;
// for (int j = 0; j <= i/k; j++)
// {
// if (i >= k && j > 0 && (i > j * k)) 
// dp[i][j] = (d[i][j] + dp[i - 1][j] + dp[i - k][j - 1]) % MOD;
// 
// else if (i < j * k) dp[i][j] = 0;
// 
// else
// dp[i][j] = 1;
// }
    }
    for(int i = 1; i <= 100000; i++)
    {
        dp[i] += dp[i - 1];
        dp[i] %= MOD; 
// if (i < k) ans[i] = 1 + ans[i - 1];
// else
// {
// ans[i] = ans[i - 1];
// for (int j = 0; j <= i/k; j++)
// {
// ans[i] += dp[i][j];
// } 
// }
    }
}

int main(){
    while(cin >> t >> k)
    {
        solve();
        while(t--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            int last = (dp[b] - dp[a - 1] + MOD) % MOD;
            printf("%d\n",last);            
        }
    } 
    return 0;
}

你可能感兴趣的:(dp,474D)