题意:
一个东西爱吃花,有两种颜色红R和白W,他吃白花每次都一组一组吃,一组是连续在一起的k个,问在花的个数从ai到bi范围里,他总共有多少种吃法?
分析:
dp[i]是长度为 i 的方案数。
当 i<k 时,只有一种方案:全是红花。dp[i]=1;
当 i>k时,dp[i]=dp[i-1]+dp[i-k]. 长度为 i 的方案数=长度为i-1的方案数+一朵红花或者长度为i-k的方案数 + K朵白花。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 5;
const int MOD = 1e9 + 7;
int a[MAX];
long long int dp[MAX], sum[MAX];
int main()
{
int t, k;
cin >>t>>k;
for(int i = 0; i < k; i++) //只能吃红花
dp[i] = 1; //dp[i]是长度为i的吃花方案数
for(int i = k; i < MAX; i++) //i>=k,dp[i]=dp[i-1]+dp[i-k],dp[i-1]+红花或者dp[i-k]+k朵白花
dp[i] = (dp[i - 1] % MOD + dp[i - k] % MOD) % MOD;
sum[1] = dp[1]; //长度为1的方案数
for(int i = 2; i < MAX; i++)
sum[i] = (sum[i - 1] % MOD + dp[i] % MOD) % MOD; //长度为i的方案数等于长度i-1的方案数加长度为i的方案数,规律:1,2,3,5
while(t --)
{
int a, b;
cin >>a>>b;
cout <<((MOD + sum[b] - sum[a - 1]) % MOD)<<endl;
}
return 0;
}