D. Flowers
题意:有t个询问,对于每个询问,你需要构造一个长度大于等于ai,小于等于bi的串。这个串只能由"R"和"W"组成,如果出现"W",必须连续出现k个。对每个询问输出一共有多少种构造方法。
思路:递推。我是先写了个暴力程序,发现和斐波那契数很像,当k=2时,直接就是斐波那契数。如果k>2,有:
ans[i]=ans[i-1]+ans[i-k], (i>k)
ans[i]=2, (i=k)
ans[i]=1, (i<k)
然后递推计算就可以了。因为是求区间和,所以我计算了前缀和,这样在计算区间时不至于超时。
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000
int cnt[100010];
ll sum[100010];
int main(){
int t,k;
cin>>t>>k;
for(int i=1;i<k;i++){
cnt[i]=1;
}
cnt[k]=2;
for(int i=k+1;i<=100000;i++){
cnt[i]=cnt[i-1]+cnt[i-k];
cnt[i]%=1000000007;
}
for(int i=1;i<=100000;i++){
sum[i]=sum[i-1]+cnt[i];
sum[i]%=1000000007;
}
while(t--){
int a,b;
cin>>a>>b;
ll ans=((sum[b]-sum[a-1])+1000000007LL)%1000000007LL;
cout<<ans<<endl;
}
return 0;
}