矩阵快速幂模板

看了原理之后顿时感受到线性代数的重要,md这不就是线
代才讲过的矩阵乘法吗,orz。。。
在这里插入图片描述这就是大概原理(将两矩阵的对应行列乘积之和作为答案矩阵的一项),显然矩阵乘法还是一个矩阵
矩阵乘法的成立有一个就是A矩阵的列必须和B矩阵的行相等(不过代码一般都是方阵到不用太过担心)
附模板代码:

#include <iostream>//矩阵快速幂(就是把数的乘法变成矩阵乘法)
using namespace std;
#define ll long long
#define lll 1000000007
ll a,b;
typedef struct l{//设立结构体矩阵
    ll net[105][105];
}jz;
jz jzkum(jz n,jz m){//矩阵快速幂模板
    jz c;
    for(ll i=0;i<a;i++){//初始化答案矩阵为0
        for(ll j=0;j<a;j++){
            c.net[i][j]=0;
        }
    }
    for(ll i=0;i<a;i++){
        for(ll j=0;j<a;j++){
            for(ll k=0;k<a;k++){
                c.net[i][j]+=n.net[i][k]*m.net[k][j]%lll;//矩阵乘法
                c.net[i][j]%=lll;
            }
        }
    }
    return c;
}
int main(){
    jz A,B;
    cin>>a>>b;
    for(ll i=0;i<a;i++){//输入原始矩阵
        for(ll j=0;j<a;j++){
            cin>>A.net[i][j];
        }
    }
    for(int i=0;i<a;i++){//将答案矩阵初始化为单位矩阵
        B.net[i][i]=1;
    }
    while(b!=0){//二进制快速幂
        if(b&1){
            B=jzkum(B,A);
        }
        A=jzkum(A,A);
        b>>=1;
    }
    for(ll i=0;i<a;i++){//输出
        for(ll j=0;j<a;j++){
            cout<<B.net[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

矩阵快速幂模板题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值