您的位置:首页 > 其它

矩阵运算及 快速幂求矩阵

2014-07-18 21:32 148 查看

矩阵运算

矩阵运算(这里主要是针对方阵)是很重要的一个环节,先说加法吧:

加法比较简单,同行同列想加就可以运算的
代码:
Mat operator+(Mat a, Mat b)
{
int i , j , k ;
Mat
for(i = 0 ; i < len ; i++)
{

for(j = 0 ; j < len ; j++)
{

c.mat[i][j] = a.mat[i][j] + b.mat[i][j];
}
}
}


其次就是乘法
原理也简单: 线性代数应该学过, a[i][k] 和 b[k][j] 和做乘积运算得到c[i][j]
代码:
Mat operator*(Mat a, Mat b)
{
int i , j, k;
Mat c;
for(i = 0;i < len ; i++)
{
for(j = 0 ; j <len ;j++)
{
c.mat[i][j] = 0;
for(k = 0 ; k < len;k++)
{
c.mat[i][j] = (a.mat[i][k] *b.mat[k][j])%MOD;
}
}
}
return c;
}


至于快速幂在ACM 中是非常重要的,当我上ACM的第一天我就知道了当时是个毛头小子什么都不懂的
先说下快速幂快速幂算法旺旺和求模放在一起 这里将输入的n 看做是二进制数因此进行while (n) 判断是否为0
看代码:
int model_exp(int a, int n)
{
int ret = 1;
while(n)
{
if(n&1)//奇偶判断
ret = ret*a%MOD;
n>>=1;//右移一维操作
a = a*a ;
}
return ret;
}


完整测试代码:
#include<iostream>
using namespace std;

const int MOD = 1000000;
int model_exp(int a, int n) { int ret = 1; while(n) { if(n&1)//奇偶判断 ret = ret*a%MOD; n>>=1;//右移一维操作 a = a*a ; } return ret; }
int main()
{
int a , n;
while(cin>>a>>n)
{
int ans = model_exp(a, n);
cout<<ans<<endl;
}
return 0;
}


到这里其实矩阵也差不多
看代码:
Mat operator^(Mat a, int x)
{//这里p为单位阵
Mat p = e, q = a;
while(x)
{
if(x&1)
p = p*q;
x>>=1;
q = q*q;
}
return p;
}


以上就是快速幂的算法的主要内容,还有遇到以后补充。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: