题意
Marmot在吃饭的时候会吃红色或者白色的两种花,所以他的晚饭可以视为一个红白花的序列,要求是白花每次出现都是以K朵一组的形式出现
输入 T(数据组数) K(每组白花个数)
问题是当Marmot吃a-b朵花时可能的序列数,答案mod(1e9+7)
note
k=2
如果序列长为1,只能是R
长为2,可以是RR,WW
长为3,可以是RWW,RRR,WWR
and so on
题解
因为白花每次K个一组出现,设dp[i]为长度为i的方案数,则有dp[i]=dp[i-1]+dp[i-k],然后前缀和就好了
初始化要注意,dp[0]=1;sum[0]=1;
dp[1]不一定为1,有可能是2(k==1时)
#include<bits/stdc++.h>
using namespace std;
const int h=1e9+7;
const int maxn=1e5;
int dp[maxn+5];
int sum[maxn+5];
int main(void)
{
#ifdef ex
freopen("in.txt","r",stdin);
#endif
int t,k;
int a,b;
scanf("%d%d",&t,&k);
dp[0]=1;
sum[0]=1;
for (int i=1;i<=maxn;++i)
{
if (i>=k ) dp[i]=(dp[i-1]+dp[i-k])%h;
else dp[i]=dp[i-1]%h;
sum[i]=(sum[i-1]+dp[i])%h;
}
for (int i=1;i<=t;++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",(sum[b]-sum[a-1]+h)%h);
}
}