首页 > 编程知识 正文

斐波那契数列矩阵快速幂,c语言矩阵的幂运算

时间:2023-05-05 17:21:51 阅读:29739 作者:4950

目标:掌握矩阵的快速幂乘

需要技能:矩阵乘法,c语言基础

要求能力:和我一样弱也能学会。

矩阵乘法通常为左行*右列(左边矩阵的第一行右边第一列,然后总计为乘法的第一行的第一个元素) ) )。

左为行,右为列,横为行,纵为列

两行2列*2行2列=2行2列

红色框看起来像第一行和第一列代表答案中第一行的第一个元素

绿色框被认为第一行和第二列表示回答的第一行、第二列的元素

蓝色边框看起来第二行和第一列代表回答中第二行的第一个元素

紫色边框看起来像第二行和第二列代表答案中第二行的第二个元素

#includebits/stdc .h //万能头using namespace std; //namespace typedef long long ll; //ll定义为long long,则#define N 111//最大数量const int M=1e9 7; //Mod包含定义数#definemod(x ) ) x ) %M )//Mod的函数int n; 结构mat { ll m [ n ] [ n ]; (}单元; //矩阵结构体和单位矩阵unit (主对角为1,其余为0 ) matoperator*(mata,mat b ) ) operator乘法mat ret; ll val,I,j; for(I=0; i n; I ) for(j=0; j n; j () {val=0; for(intk=0; k n; k ) ) val=mod((ll ) a.m[i][k]*b.m[k][j] );//三个循环尝试求矩阵的乘法mod (ret.m [ I ] [ j ]=mod ) val ); //mod也需要是为了防止数量过多}}return ret; //返回两个矩阵相乘的结果(}void init ) ) for ) intI=0; i N; I ) {unit.m[i][i]=1; (} //init单位矩阵) matquick_pow ) mata,ll n ) /快速矩阵幂mat res=unit; while(n ) if ) N1 ) res=res*a; a=a*a; n=1; }返回RES; (}int main ) ) { cin n; init (; mat a,b; cout '第一个' endl; for(intI=0; i n; I ) for(intj=0; j n; j ) {cina.m[i][j]; }//写入矩阵matans=quick_pow(a,2 ); //调用快速矩阵2是幂for(intI=0; i n; I ) for(intj=0; j n; j({coutans.m[I][j] '; }coutendl; //输出结果return 0; 如果不知道quick_pow,让我们看看int应该如何快速。 博客上有介绍。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。