#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
const int m=4;
const int mod=10007;
int a[4][4]={
{2,1,1,0},
{1,2,0,1},
{1,0,2,1},
{0,1,1,2}
};
struct matrix{
int f[4][4];
};
matrix mul(matrix a,matrix b)
{
int i,j,k;
matrix c;
memset(c.f,0,sizeof(c.f));
for(k=0;k<m;k++)
{
for(i=0;i<m;i++)
{
if(!a.f[i][k])continue;
for(j=0;j<m;j++)
{
if(!b.f[k][j])continue;
c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[j][k])%mod;
}
}
}
return c;
}
matrix pow_mod(matrix a,int b)
{
matrix s;
memset(s.f,0,sizeof(s.f));
for(int i=0;i<m;i++)
s.f[i][i]=1;
while(b)
{
if(b&1)
s=mul(s,a);
a=mul(a,a);
b=b>>1;
}
return s;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
matrix e;
memcpy(e.f,a,sizeof(a));
e=pow_mod(e,n-1);
cout<<(e.f[0][0]*2+e.f[1][0]+e.f[2][0])%mod<<endl;
}
return 0;
}
/*
dp[i][j][k]表示长度为i,红色个数的奇偶性j,绿色个数的奇偶性为k.j,k为1或0,表示奇和偶。
dp[i][j][k]=2*dp[i-1][j][k]+dp[i-1][1-j][k]+dp[i-1][j][1-k];
由于n太大,需要用矩阵,所以jk用00 ,01 ,10, 11表示
则矩阵为:
|dp[i-1][00] dp[i-1][01] dp[i-1][10] dp[i-1][11]|*|2 1 1 0|=|dp[i][00] dp[i][01] dp[i][10] dp[i][11]|
|1 2 0 1|
|1 0 2 1|
|0 1 1 2|
*/
poj 3734 Blocks 矩阵
最新推荐文章于 2019-02-24 15:42:47 发布