当前位置:网站首页>新瓶陈酒 --- 矩阵快速幂
新瓶陈酒 --- 矩阵快速幂
2022-07-31 05:21:00 【im34v】
矩阵
//矩阵的定义
typedef struct Matrix{
int r,c,matrix[MAXN][MAXN];
Matrix(){
r=c=0;
memset(matrix,0,sizeof matrix);
}
}Matrix;
//读入矩阵
void readMatrix(Matrix &n){
cin>>n.r>>n.c;
for(int i=1;i<=n.r;++i){
for(int j=1;j<=n.c;++j)
cin>>n.matrix[i][j];
}
}
//打印输出矩阵
void printMatrix(Matrix n){
cout<<n.r<<" "<<n.c;
for(int i=1;i<=n.r;++i){
for(int j=1;j<=n.c;++j)
cout<<n.matrix[i][j]<<" ";
cout<<endl;
}
}
矩阵乘法
//不带取余的矩阵乘法
Matrix multiMatrix(Matrix a,Matrix b){
Matrix c; c.r=a.r; c.c=b.c;
for(int i=1;i<=a.r;++i)
for(int j=1;j<=b.c;++j)
for(int k=1;k<=a.c;++k)
c.matrix[i][j]+=matrix.a[i][k]*b.matrix[k][j];
return c;
}
矩阵快速幂
//带取余的矩阵乘法
Matrix multiMatrix(Matrix a,Matrix b,int mod){
Matrix c;
c.r=a.r;
c.c=b.c;
for(int i=1;i<=a.r;++i)
for(int j=1;j<=b.c;++j)
for(int k=1;k<=a.c;++k)
//和不带取余的矩阵乘法主要差距在这一语句上
c.matrix[i][j]=(c.matrix[i][j]+(a.matrix[i][k]*b.matrix[k][j])%mod)%mod;
return c;
}
//构造一个单位矩阵
Matrix initMatrix(int n){
Matrix a;
a.r=a.c=n;
for(int i=1;i<=n;i++)a.matrix[i][i]=1;
return a;
}
//矩阵快速幂其实和数字的快速幂没有本质区别,都是采用二分的思路
Matrix quickMultiMatrix(Matrix a,int n,int mod){
Matrix ans=initMatrix(a.r);
Matrix temp=a;
while(n){
if(n&1)ans=multiMatrix(ans,temp,mod);
temp=multiMatrix(temp,temp,mod);
n/=2;
}
return ans;
}
边栏推荐
猜你喜欢
随机推荐
银河麒麟v10 sp1 安装 PostgreSQL 11.16
Oracle入门 07 - Linux 操作系统安装配置(REHL 7.x)
浅析v-model语法糖的实现原理与细节知识及如何让你开发的组件支持v-model
常用浏览器内核的了解、ES5和ES6的区别、ES6的更新的笔试题
Oracle入门 02 - IT软硬件平台及操作系统介绍
编辑时过滤当前节点及根据限制的层数过滤数据
浅析瀑布流布局原理及实现方式
(border-box)盒子模型w3c、IE的区别
ES6-01-ES的简介
alert弹框处理,div块处理,上传文件
SSH远程管理
ES6-02-let和const关键字
Oracle入门 05 - VirtualBox的虚拟机安装配置
什么样的人不适合入行编程?你真的适合学习编程吗?
ES6-箭头函数
DNS域名解析服务
三本毕业,中途转行软件测试,顶着这些光环从月薪7k干到20k+,感觉还不错
通过js禁止ctrl+滚轮放缩浏览器页面,禁止用手势放大
11.0 堆参数调优入门之堆参数调整
TypeScript基本类型









