您的位置:首页 > 其它

矩阵快速幂

2015-06-18 23:31 344 查看
矩阵乘法是一种高效的算法可以把一些一维递推优化到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<stdio.h>
#include<string.h>
#define mod 10000007
typedef long long ll;
struct Mat
{
ll mat[5][5];
};

Mat operator * (Mat a, Mat b)
{
Mat c;
memset(c.mat, 0, sizeof(c.mat));
for(int k=0; k<3; k++)
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
c.mat[i][j] = (c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod;
return c;
}

int main()
{
int n, k;
Mat a, res;

while(~scanf("%d%d", &n,&k))
{
ll f1 = -1, f2 = -1, f, sum=0;
for(int i=0; i<n; i++)
{
scanf("%lld", &f);
sum += f;
if(f > f1) f2 = f1, f1 = f;
else if(f > f2) f2 = f;
}//f1,f2为初始值
sum = sum-f1-f2;
a.mat[0][0]=1; a.mat[0][1] = a.mat[0][2]=0;
a.mat[1][0] = a.mat[1][1] = a.mat[1][2] = 1;
a.mat[2][0] = a.mat[2][1] = 1; a.mat[2][2] = 0;
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
res.mat[i][j] = (i==j); //初始为单位矩阵
for(; k>0; k>>=1) //快速幂
{
if(k & 1) res = res*a;
a = a*a;
}
sum += (f1+f2)*res.mat[0][0]+f1*res.mat[1][0]+f2*res.mat[2][0];
printf("%lld\n", sum%mod);
}
return 0;
}


View Code
感觉学长的代码和我的代码并没什么区别, 然而,,,,。 真是无语啦!。 不管怎样,弱渣仍需修练!

《6》这里还有几个特别巧妙地题。

http://www.cnblogs.com/kuangbin/category/405835.html(巨巨到底是巨巨!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: