矩阵运算及 快速幂求矩阵
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; }
以上就是快速幂的算法的主要内容,还有遇到以后补充。。。
相关文章推荐
- 矩阵运算,矩阵快速幂,模板
- 【矩阵快速幂+矩阵运算性质】Fast Matrix Calculation HDU - 4965
- 矩阵快速幂——将运算推广到矩阵上HDU 1575
- poj 3745 Training little cats (矩阵运算+矩阵快速幂)
- NumPy-快速处理数据--矩阵运算
- 【快速幂运算与矩阵快速幂专题】
- 矩阵运算快速方法
- ACM: 矩阵快速幂运算 数论题 poj 3…
- 【模板篇】01 矩阵运算 方阵快速幂
- 矩阵快速运算_总结
- 洛谷P3390【模板】矩阵快速幂——矩阵运算入门笔记
- 矩阵运算 快速幂
- 矩阵的运算 --- 矩阵快速幂(UVA10689 - Yet another Number Sequence)
- HDU 2276-Kiki & Little Kiki 2(矩阵快速幂+位运算)
- 继递归递推求斐波那契后的另一种奇妙方法---矩阵乘法+快速幂运算
- HDU 2256 & HDU 4565 (矩阵快速幂 + 公式推演)
- Java调用jama实现矩阵运算
- HDU2276 - Kiki & Little Kiki 2(矩阵快速幂)
- hdu 2604Queuing dp+ 矩阵快速幂
- Power of Matrix UVA - 11149(矩阵快速幂+二分或许叫倍增优化)