[YM]模板-矩阵快速幂

概念:

前置知识:

普通快速幂:[YM]模板-快速幂-CSDN博客

矩阵加减法:

一个m行n列的矩阵用二维数组matrix[ ][ ]存储

(1)矩阵的加减法

两个矩阵对应位置的元素加减即可

矩阵乘法:

(2)矩阵的乘法

1)一个数k乘矩阵A,把k乘以矩阵的每一个元素,记为kA

2)两个矩阵A和B相乘,要求A的列数等于B的行数,设A的尺寸为m*n

,B的尺寸为n*u,那么乘积C=A*B的尺寸为m*u。

复杂度:O(m*n*u)

矩阵快速幂:

快速幂都是行列相同的矩阵

单位矩阵相当于一开始的res=1的“1”

模板:

struct Matrix{
    int M;
    vector<vector<ll>>m;
    Matrix(){}
    Matrix(int n){
        M=n;
        m.resize(n+1,vector<ll>(n+1,0));
    }
    void init(){
        for(int i=1;i<=M;i++)m[i][i]=1;
    }
    Matrix operator*(const Matrix &B)const{
		Matrix ans(M);
        for(int i=1;i<=M;i++)
            for(int j=1;j<=M;j++)
                for(int k=1;k<=M;k++)
                    ans.m[i][j]=(ans.m[i][j]+m[i][k]*B.m[k][j]%mod)%mod;
		return ans;
	}
    Matrix operator*(ll n)const{
        Matrix ans(M),a=*this;
        ans.init();
        while(n){
            if(n&1)ans=ans*a;
            a=a*a;
            n>>=1;
        }
        return ans;
    }
    void show(){
        for(int i=1;i<=M;i++)
            for(int j=1;j<=M;j++)
                cout<<m[i][j]<<" \n"[j==M];
    }
};

例题:

P3390 【模板】矩阵快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

/*---code---*/
struct Matrix{
    int M;
    vector<vector<ll>>m;
    Matrix(){}
    Matrix(int n){
        M=n;
        m.resize(n+1,vector<ll>(n+1,0));
    }
    void init(){
        for(int i=1;i<=M;i++)m[i][i]=1;
    }
    Matrix operator*(const Matrix &B)const{
		Matrix ans(M);
        for(int i=1;i<=M;i++)
            for(int j=1;j<=M;j++)
                for(int k=1;k<=M;k++)
                    ans.m[i][j]=(ans.m[i][j]+m[i][k]*B.m[k][j]%mod)%mod;
		return ans;
	}
    Matrix operator*(ll n)const{
        Matrix ans(M),a=*this;
        ans.init();
        while(n){
            if(n&1)ans=ans*a;
            a=a*a;
            n>>=1;
        }
        return ans;
    }
    void show(){
        for(int i=1;i<=M;i++)
            for(int j=1;j<=M;j++)
                cout<<m[i][j]<<" \n"[j==M];
    }
};
int n;
ll k;
void solve(){
    cin>>n>>k;
    Matrix a(n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a.m[i][j];
    (a*k).show();
}   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值