标签:
矩阵乘法是一种高效的算法可以把一些一维递推优化到log( n ),还可以求路径方案等,所以更是是一种应用性极强的算法。矩阵,是线性代数中的基本概念之一。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。矩阵乘法看起来很奇怪,但实际上非常有用,应用也十分广泛。
基本定义
它是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足
矩阵乘法满足结合率,但不满足交换率
一般的矩乘要结合快速幂才有效果``
http://poj.org/problem?id=3070
#include<cstdio> #include<iostream> using namespace std; const int MOD = 10000; struct matrix{ int m[2][2]; }ans, base; matrix mul(matrix a, matrix b) { matrix tmp; for(int i=0; i<2; ++i) { for(int j=0; j<2; ++j) { tmp.m[i][j] = 0; for(int k=0; k<2; ++k) tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD; } } return tmp; } int fast_mod(int n) { base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; ans.m[0][0] = ans.m[1][1] = 1; ans.m[0][1] = ans.m[1][0] = 0; while(n) { if(n&1) { ans = mul(ans, base); } base = mul(base, base); n >>= 1; } return ans.m[0][1]; } int main() { int n; while(scanf("%d", &n)&&n!=-1) { printf("%d\n", fast_mod(n)); } return 0; }
稍加优化:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int MOD = 10000; struct matrix{ int m[2][2]; }ans, base; matrix mul(matrix a, matrix b) { matrix tmp; memset(tmp.m, 0, sizeof(tmp.m)); for(int i=0; i<2; i++) for(int k=0; k<2; k++) if(a.m[i][k]) for(int j=0; j<2; j++) tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD; return tmp; } int fast_mod(int n) { base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; ans.m[0][0] = ans.m[1][1] = 1; ans.m[0][1] = ans.m[1][0] = 0; while(n) { if(n&1) { ans = mul(ans, base); } base = mul(base, base); n >>= 1; } return ans.m[0][1]; } int main() { int n; while(scanf("%d", &n)&&n!=-1) { printf("%d\n", fast_mod(n)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/acm1314/p/4587326.html