牛客多校第二场A

题目

dp[i][0/1] 后面 0或1表示最后一步走的还是跑的

dp[i][0] = dp[i-1][0] + dp[i-1][1]    走过来的就是前一步走的,加前一步跑的总方案数

dp[i][1] = dp[i-k][0]   跑过来的就是 前k步状态时走过来的方案 (前K步走的时候  然后再跑一步跑到当前状态)

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
const int maxn = 100005;
const int mod = 1000000007;
int q, k;
ll dp[maxn][2];
ll sum[maxn];
int main()
{
	cin >> q >> k;

	dp[0][0] = 1;

	for(int i = 1;i < maxn;i ++)
	{
		dp[i][0] = (dp[i-1][0] + dp[i-1][1]) % mod;

		if(i >= k)
		{
			dp[i][1] = dp[i-k][0];
		}

		sum[i] = sum[i-1] + dp[i][0] + dp[i][1];
		sum[i] %= mod;
	}
	int l, r;
	while(q --)
	{
		cin >> l >> r;
		cout << (sum[r] - sum[l-1] + mod) % mod << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/soul_97/article/details/81148966