Description
衣食无忧的 Q老师 有一天突发奇想,想要去感受一下劳动人民的艰苦生活。
具体工作是这样的,有 N 块砖排成一排染色,每一块砖需要涂上红、蓝、绿、黄这 4 种颜色中的其中 1 种。且当这 N 块砖中红色和绿色的块数均为偶数时,染色效果最佳。
为了使工作效率更高,Q老师 想要知道一共有多少种方案可以使染色效果最佳,你能帮帮他吗?
Input
第一行为 T,代表数据组数。(1 ≤ T ≤ 100)
接下来 T 行每行包括一个数字 N,代表有 N 块砖。(1 ≤ N ≤ 1e9)
Output
输出满足条件的方案数,答案模 10007。
Sample Input
2
1
2
Sample Output
2
6
#include<iostream>
#include<string.h>
using namespace std;
int m=10007;
const int N = 3;
struct Matrix {
int x[N][N];
Matrix operator*(const Matrix& t) const {
Matrix rs;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
rs.x[i][j] = 0;
for (int k = 0; k < N; ++k) {
rs.x[i][j] += x[i][k] * t.x[k][j];
rs.x[i][j] = rs.x[i][j] % m;
}
}
}
return rs;
}
Matrix() {
memset(x, 0, sizeof(x));
}
Matrix(const Matrix& t) {
memcpy(x, t.x, sizeof(x));
}
};
Matrix qpow(Matrix m, int n) {
Matrix ret;
for (int i = 0; i < 3; i++) {
ret.x[i][i] = 1;
}
while (n) {
if (n & 1) {
ret = m * ret;
}
m = m * m;
n >>= 1;
}
return ret;
}
int main() {
int t;
cin>>t;
for (int ti = 0; ti < t; ti++) {
int n;
cin>>n;
Matrix m1;
//int ini[3][3]={2,0,1,0,2,1,2,2,2};
m1.x[0][0]=2;m1.x[0][1]=0;m1.x[0][2]=1;
m1.x[1][0]=0;m1.x[1][1]=2;m1.x[1][2]=1;
m1.x[2][0]=2;m1.x[2][1]=2;m1.x[2][2]=2;
Matrix mm = qpow(m1, n-1);
int rs = 0;
int L[]={2,0,2};
for (int j = 0; j < 3; j++) {
rs += mm.x[0][j] * L[j];
rs = rs % m;
}
cout << rs << endl;
}
return 0;
}