CodeForces - 185A Plant 矩阵快速幂
2015-05-27 10:11
134 查看
题目大意:有一个三角形,刚开始是1个up,0个down,1年后,这个三角形变成了3个up,1个down的
之后的每一年,每个三角形都会变成四个,其中三个是相同方向的,1个是相反方向的,问n年后,共有多少个三角形是up的
解题思路:水题啊,看错了题意,以为循环变化指的是其中一年只变up的,然后第二年是所有的三角形都变的那种循环,结果循环是第一年只变up,之后每一年都是所有三角形都在变。。。
变化矩阵,就是(3,1,1,3)是个2*2的矩阵
之后的每一年,每个三角形都会变成四个,其中三个是相同方向的,1个是相反方向的,问n年后,共有多少个三角形是up的
解题思路:水题啊,看错了题意,以为循环变化指的是其中一年只变up的,然后第二年是所有的三角形都变的那种循环,结果循环是第一年只变up,之后每一年都是所有三角形都在变。。。
变化矩阵,就是(3,1,1,3)是个2*2的矩阵
[code]#include<cstdio> #include<cstring> typedef unsigned long long ll; const int N = 2; const ll mod = 1e9 + 7; struct Matrix{ ll mat ; }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; }
相关文章推荐
- codeforces 185A Plant(矩阵快速幂)
- codeforces 185A Plant(矩阵快速幂)
- codeforces 185a(矩阵快速幂)
- codeforces - 185 - A - Plant 【经典矩阵快速幂】
- CodeForces-185A(矩阵快速幂)
- Codeforces 185A Plant 普通快速幂取模
- codeforces 185A 矩阵快速幂
- CodeForces 185A. Plant(矩阵快速幂) 构造
- Codeforces 450B f【n】=f【n-1】-f【n-2】(矩阵快速幂,裸题)
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
- codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)
- CodeForces 185A. Plant (矩阵快速幂)
- Codeforces - 551D. GukiZ and Binary Operations - 数学+矩阵快速幂
- Codeforces 691E Xor-sequences【矩阵快速幂,好题】
- codeforces 185A Plant
- Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]
- 矩阵快速幂DP Darth Vader and Tree : CodeForces - 514E
- CodeForces 678D Iterated Linear Function 矩阵快速幂
- CodeForces 392C Yet Another Number Sequence 矩阵快速幂
- CodeForces 450B (矩阵快速幂模板题+负数取模)