牛客2018多校第二场A

转移方程:

dp[i][1] = dp[i - k][0]

dp[i][0] = dp[i - 1][0] + dp[i - 1][1]

其中0代表第到第i米是走过去的,1代表是跑过去的

然后再预处理一个前缀和就ok了

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int M = 1e9 + 7;

int dp[100100][2];
int ans[100100];

int main(){
	int q, k;
	scanf("%d%d", &q, &k);
	int a, b;
	dp[0][0] = 1;
	for(int i = 1; i <= 100000; i ++){
		if(i >= k)
			dp[i][1] = dp[i - k][0] % M;
		dp[i][0] = (dp[i - 1][0] % M + dp[i - 1][1] % M ) % M;
		
//		cout << "debug " << i << ' ' << dp[i][0] << ' ' << dp[i][1] << endl;
	}
	for(int i = 1; i <= 100000; i ++){
		ans[i] = (dp[i][0] % M + dp[i][1] % M + ans[i - 1] % M ) % M;
	}
	while(q --){
		scanf("%d%d", &a, &b);
//		cout << ans[a - 1] << ' ' << ans[b] << endl;
		printf("%d\n", (ans[b] % M - ans[a - 1] % M + M) % M);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/81406841