http://202.121.199.212/JudgeOnline/problem.php?cid=1076&pid=7
分析: f[ i ]的含义与核电站问题是一致的;
dp[ i ] 则为至少M个连续红色的方案,
dp[ i ] =0 i<m;
dp[ i ]=1 i==m;
dp[ i ]=2*dp[ i ]+f[ i-m-1 ] i>m;
代码:
#include <stdio.h>
#include <string.h>
#define MOD 1000000007
#define MAXN 100000
#define ll long long
int m,n;
ll f[MAXN],dp[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF){
memset(f,0,sizeof(f));
memset(dp, 0,sizeof(dp));
f[0]=1;
for(int i=1;i<=n;i++){
if(i<m){
f[i]=(2*f[i-1])%MOD;
dp[i]=0;
}
if(i==m){
f[i]=(2*f[i-1]-1)%MOD;
dp[i]=1;
}
if(i>m){
f[i]=(2*f[i-1]-f[i-m-1]+MOD)%MOD;
dp[i]=(2*dp[i-1]+f[i-m-1]+MOD)%MOD;
}
}
printf("%lld\n",dp[n]);
}
return 0;
}