Blocks POJ - 3734(白书例题)

题目大意:

给定N个方块排成一列。先用红、蓝、绿、黄四种颜色涂方块,问红色方块跟绿色方块同为偶数的方案有多少个

 分析:

    设涂到第i个方块时,红绿都是偶数的方案数为ai,两者中只有一者为偶数bi,两者都是奇数的方案ci,可以得
到下列递推:
(先说a[i+1]的递推):
1.到i都为偶数,i+1个都涂另外两种颜色中的一个(所以就是a[i]×2)
2.到i只有一个为奇数,i+1涂成奇数的那个(所以时b[i])
综上所述:a[i+1]=b[i]+a[i]×2
同理b[i+1]=2×a[i]+2×b[i]+2×c[i]
     c[i+1]=b[i]+2×c[i]
/*
a[i] 	|2 1 0|^n  a[0](1)
b[i]  = |2 2 2|     b[0](0)
c[i]	|0 1 2|      c[0](0)
*/ 

 code:

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define pb push_back
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
#define lson l,m,rt<<1
#define cmm(x) cout<<"("<<(x)<<")";
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>PLL;
typedef pair<int,ll>Pil;
typedef pair<ll,int>Pli;
const ll INF = 0x3f3f3f3f;
const ll inf=0x7fffffff;
const double eps=1e-8;
const int maxn =1000000;
const int N = 510;
const ll mod=1e9+7;
const ll MOD=10007;
//------
//define
typedef vector<int> vec;
typedef vector<vec> mat;

mat mul(mat &A,mat&B){
	mat C(A.size(),vec(B[0].size()));
	for(int i=0;i<A.size();i++){
		for(int k=0;k<B.size();k++){
			for(int j=0;j<B[0].size();j++){
				C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;
			}
		}
	}
	return C;
}
mat pow(mat A,ll n){
	mat B(A.size(),vec(A.size()));
	//单位阵 I 
	for(int i=0;i<A.size();i++){
		B[i][i]=1;
	}
	while(n>0){
		if(n&1)B=mul(B,A);
		A=mul(A,A);
		n>>=1;
	}
	return B;
}
//solve
void solve() {
	int T;
	cin>>T;
	while(T--){
		int N;
		cin>>N;
		mat A(3,vec(3));
		A[0][0]=2;A[0][1]=1;A[0][2]=0;
		A[1][0]=2;A[1][1]=2;A[1][2]=2;
		A[2][0]=0;A[2][1]=1;A[2][2]=2;
		A=pow(A,N);
		cout<<A[0][0]<<endl;
	}
}
int main() {
	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	cin.tie(0);
	cout.tie(0);
	solve();
	/*
		#ifdef debug
			fclose(stdin);
			fclose(stdout);
			system("out.txt");
		#endif
	*/
	return 0;
}

 

posted @ 2018-05-31 22:18  visualVK  阅读(174)  评论(0编辑  收藏  举报