474D - Flowers

简单dp,有一个字符串,规则要这样,RWWWR,其中W必须会是K个字符连续出现的,如K=2,可以使WWRR WWWW,不能是WWWR。现在给定字符串的长度a,b。求长度在a-b之间的满足要求的字符串个数。

转移很简单 dp[i]=dp[i-1]+dp[i-k]。具体看代码好了

#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <cassert>
#include <stack>
#include <map>
using namespace std;

typedef long long ll;
ll mod = 1000000007;
ll dp[110000];
ll sum[110000];
int main(){
	int t, k,a,b;
	cin >> t >> k;
	dp[0] = 1;
	for (int i = 1; i <= 100000; i++){
		dp[i] = dp[i - 1];
		if (i>=k) dp[i] += dp[i - k];
		while (dp[i] >= mod) dp[i] -= mod;
		//cout << dp[i] << endl;
	}

	for (int i = 1; i <= 100000; i++){
		sum[i] = sum[i - 1] + dp[i];
		while (sum[i] >= mod) sum[i] -= mod;
	}
	while (t--){
		cin >> a >> b;
		ll ans = sum[b] - sum[a - 1];
		while (ans < 0) ans += mod;
		cout << ans << endl;
	}
}

你可能感兴趣的:(474D - Flowers)