矩阵快速幂的写法(模板)
来源:互联网 发布:易语言精易模块源码 编辑:程序博客网 时间:2024/05/21 17:55
首先一般会定义一个结构体
<span style="font-size:18px;">struct matrix{int a[n][m];};</span>
2*2的矩阵直接可以用两个for
<span style="font-size:18px;">matrix mul(matrix a, matrix b){matrix ret;for(int i=0;i<2;i++){for(int j=0;j<2;j++){ret.a[i][j] = (a.a[i][0]*b.a[0][j]+a.a[i][1]*b.a[1][j]);}}return ret;}</span>
接下来就是O(n^3)的算法(如l*n的矩阵与n*m的矩阵相乘)
<span style="font-size:18px;">matrix mul(matrix a, matrix b){matrix ret;for(int i=0;i<l;i++){for(int j=0;j<m;j++){ret.a[i][j]=0;for(int k=0;k<n;k++){ret.a[i][j] += a.a[i][k]*b.a[k][j];}}}return ret;}</span>
这个简单易懂,但是效率不太高,极易超时
以下是效率较高的
<span style="font-size:18px;">matrix mul(matrix a, matrix b) { matrix ret; for(int i=0;i<l;i++){for(int j=0;j<m;j++){ret.a[i][j]=0;}} //初始化必不可少 for(int i=0;i<l;i++) {for(int k=0;k<n;k++) { if(a.a[i][k]) { for(int j=0;j<m;j++) { if(b.a[k][j]) ret.a[i][j]+=a.a[i][k]*b.a[k][j]; } }} } return ret; } </span>
综上,大致可以写成(以2*2的矩阵为例)
<span style="font-size:18px;">#include <iostream>using namespace std;struct matrix{int a[2][2];};matrix mul(matrix a, matrix b) { matrix ret; for(int i=0;i<2;i++) {for(int j=0;j<m;j++) {ret.a[i][j] = a.a[i][0]*b.a[0][j]+a.a[i][1]*b.a[1][j];} } return ret; } matrix mpower(matrix a, int n){matrix I;I.a[0][0] = I.a[1][1] = 1;I.a[0][1] = I.a[1][0] = 0;//将I初始化为单位矩阵while(n){if(n&1) I = mul(I,a);a = mul(a,a);n>>=1;} return I;} int main(){cin//先输入 //然后初始化矩阵 ,假设n个tmp矩阵相乘 tmp = mpower(tmp,n);//输出矩阵中的数return 0; }</span>
0 0
- 矩阵快速幂的写法(模板)
- 矩阵的快速幂模板
- 矩阵快速幂比较好的写法
- 矩阵快速幂(模板)
- 矩阵快速幂 (模板)
- 快速矩阵幂(模板)
- 快速幂,矩阵快速幂(模板)
- 矩阵快速幂模板
- 矩阵快速幂--模板
- 矩阵快速幂 模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 【矩阵快速幂模板】
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂【模板】
- 矩阵快速幂模板
- java_web初学笔记之<Servlet中的request和response对象详解>
- windows 消息机制的那些事
- 差分不等式
- HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
- poj4512(2013腾讯编程马拉松——完美队形1)(动规)
- 矩阵快速幂的写法(模板)
- 求森林叶子结点数
- 【c语言】关于临时变量出其作用域就释放的例子
- [转帖]机器学习笔记——Fisher vector
- android系统相机专题
- 隐藏元素的3中方法
- JNA项目地址
- UVA 11181(数学概率)
- C++ Gotchas && FAQ(1)