codeforce 474D Flowers

来源:互联网 发布:佳博网络打印机设置 编辑:程序博客网 时间:2024/06/01 08:04

原题地址


题意

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 exfreopen("in.txt","r",stdin);#endifint 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);}}






0 0