poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)

N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余

Sample Input

2
1
2
Sample Output

2//(蓝,黄)
6//(红红,蓝蓝,蓝黄,绿绿,黄蓝,黄黄)

 

 

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <map>
 6 # include <cmath>
 7 # define LL long long
 8 using namespace std ;
 9 
10 const int MOD = 10007 ;
11 
12 struct Matrix
13 {
14     LL mat[3][3];
15 };
16 
17 Matrix mul(Matrix a,Matrix b) //矩阵乘法
18 {
19     Matrix c;
20     for(int i=0;i<3;i++)
21         for(int j=0;j<3;j++)
22         {
23             c.mat[i][j]=0;
24             for(int k=0;k<3;k++)
25             {
26                 c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j])%MOD;
27             }
28         }
29     return c;
30 }
31 Matrix pow_M(Matrix a,int k)  //矩阵快速幂
32 {
33     Matrix ans;
34     memset(ans.mat,0,sizeof(ans.mat));
35     for (int i=0;i<3;i++)
36         ans.mat[i][i]=1;
37     Matrix temp=a;
38     while(k)
39     {
40         if(k&1)ans=mul(ans,temp);
41         temp=mul(temp,temp);
42         k>>=1;
43     }
44     return ans;
45 }
46 
47 
48 
49 int main ()
50 {
51    // freopen("in.txt","r",stdin) ;
52     int T;
53     cin>>T ;
54     Matrix t ;
55     t.mat[0][0] = 2 ; t.mat[0][1] = 1 ; t.mat[0][2] = 0 ;
56     t.mat[1][0] = 2 ; t.mat[1][1] = 2 ; t.mat[1][2] = 2 ;
57     t.mat[2][0] = 0 ; t.mat[2][1] = 1 ; t.mat[2][2] = 2 ;
58     while(T--)
59     {
60         int n ;
61         cin>>n ;
62         Matrix ans = pow_M(t,n) ;
63         cout<<ans.mat[0][0]%MOD<<endl ;
64 
65     }
66 
67 
68     return 0 ;
69 }
View Code

 

posted @ 2015-05-28 19:39  __Meng  阅读(402)  评论(0编辑  收藏  举报