Description
在一个1*N的格子上,每个格子可以选择涂成红色或蓝色。 求至少 M 个连续为红色的方案数。
Input
多组输入,每组输入包含两个整数M和N (0<N,M<100000)
Output
输出存在至少连续M个为红色的方案数,对1000000007取模
Sample Input
3 4
Sample Output
3
这道题有点意思,基本就是核电站问题的翻版
基本思路就是,还是和核电站一样,要考虑前几个格子避免连续n个红格子的思路
嗯,忘了刚才那句吧,我再说一遍
f[i]请参见核电站对f数组的定义
而q[i]就是这次前i个 (里面至少 M 个连续为红色)的方案数
q[i]=q[i-1]*2(这里就是指在第i个涂红还是不涂红)+f[i-m-1](考虑到i-m+1到i全涂红的方案数)
#include<iostream> #include <stdio.h> #include <math.h> #include<stdio.h> #include<string.h> using namespace std; const int MOD=1e9+7; int main() { long long f[100000];int i,n,m; long long g[100000]; int number; while(scanf("%d%d",&m,&n)!=EOF) { memset(f,0,sizeof(f)); memset(g, 0,sizeof(g)); f[0]=1; for(i=1;i<=n;i++) { if(i<m) { f[i]=2*f[i-1]; f[i]%=MOD; g[i]=0; } if(i==m) { f[i]=2*f[i-1]-1; f[i]%=MOD; g[i]=1; } if(i>m) { f[i]=2*f[i-1]-f[i-m-1]+MOD; f[i]=f[i]%MOD; g[i]=2*g[i-1]+f[i-m-1]+MOD; g[i]=g[i]%MOD; } } for(i=1;i<=n;i++) { printf(" g[%d]=%d f[%d]=%d \n",i,g[i],i,f[i]); } cout<<g[n]%1000000007<<endl; // cout<<" "<<m+n<<endl; } return 0; }
涂色游戏
时间: 2024-11-12 00:28:30