Time Limit:4s Memory Limit:128MByte
Submissions:246Solved:78
Constroy likes the game called Reversi. He has a long paper tape with n grids, where each grid should fill by one black chess or one white chess exactly. Constroydislikes the situation with a consecutive black chesses or b consecutive white chesses, so he intends to know how many situaions satisfy his preference.
The answer may be so large, but you only need to give the answer modulo (109+7).
明显是要dp的
考虑d[i][j]=长度为i的棋盘 最后一个棋子为j颜色的合法方案数 j=0,1
单独考虑d[i][0]
明显 d[i-1][1]后加一个0可以得到合法序列
d[i-1][0]后直接加0 可能出现xxxx1 + a个0 这种不合法情况
而这种情况 = d[i-a][1] :即xxxx1 的方案数
so: d[i][0] = d[i-1][1] + d[i-1][0] - d[i-a][1]
这题真正坑的地方是 i==0时
显然应该把空串看做一个串 但是d[0][0]=d[0][1]=1
就变成了空串有2个串
只好特判一下
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<math.h>
#include<list>
#include<cstring>
#include<fstream>
#include<queue>
#include<sstream>
//#include<memory.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define INF 1000000007
#define pll pair<ll,ll>
#define pid pair<int,double>
const int N = 1e6+5;
const int MOD = 1e9+7;
int a,b,n;
int d[N][2];//d[i][j]=前i个棋子,第i个棋子颜色为j的合法方案数
int dp(){
d[0][1]=d[0][0]=0;
for(int i=1;i<=n;++i) {
int sum = (d[i - 1][0] + d[i - 1][1]) % MOD;
if(i==1){
sum=1;
}
d[i][0]=d[i][1]=sum;
if(i-a>=0){
d[i][0] = (d[i][0] - d[i-a][1] - (i==a) + MOD)%MOD;//i==a表示空串的情况
}
if(i-b>=0){
d[i][1] = (d[i][1] - d[i-b][0] - (i==b) + MOD)%MOD;
}
}
return (d[n][0]+d[n][1])%MOD;
}
int main()
{
//freopen("/home/lu/Documents/r.txt","r",stdin);
//freopen("/home/lu/Documents/w.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&a,&b,&n);
printf("%d\n",dp());
}
return 0;
}