标签:
题目大意:有一个三角形,刚开始是1个up,0个down,1年后,这个三角形变成了3个up,1个down的
之后的每一年,每个三角形都会变成四个,其中三个是相同方向的,1个是相反方向的,问n年后,共有多少个三角形是up的
解题思路:水题啊,看错了题意,以为循环变化指的是其中一年只变up的,然后第二年是所有的三角形都变的那种循环,结果循环是第一年只变up,之后每一年都是所有三角形都在变。。。
变化矩阵,就是(3,1,1,3)是个2*2的矩阵
#include<cstdio>
#include<cstring>
typedef unsigned long long ll;
const int N = 2;
const ll mod = 1e9 + 7;
struct Matrix{
ll mat[N][N];
}A, B, tmp;
ll n;
Matrix matMul(Matrix x, Matrix y) {
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++) {
tmp.mat[i][j] = 0;
for(int k = 0; k < N; k++)
tmp.mat[i][j] += (x.mat[i][k] * y.mat[k][j]) % mod;
}
return tmp;
}
void solve() {
while(n) {
if(n & 1)
B = matMul(B,A);
A = matMul(A,A);
n >>= 1;
}
}
void init() {
B.mat[0][0] = B.mat[1][1] = 1;
A.mat[0][0] = 3;
A.mat[0][1] = 1;
A.mat[1][0] = 1;
A.mat[1][1] = 3;
}
int main() {
init();
scanf("%I64d", &n);
if(n == 0)
printf("1\n");
else if(n == 1) {
printf("3\n");
}
else {
n -= 1;
solve();
printf("%I64d\n", (3 * B.mat[0][0] + B.mat[1][0]) % mod);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/l123012013048/article/details/46042993