矩阵乘法/快速幂

image

这就是矩阵乘法的原理,当且仅当 \(m\) 行 \(n\) 列和 \(n\) 行 \(k\) 列的矩阵相乘时可以得到 \(m\) 行 \(k\) 列的矩阵。

矩阵快速幂非常简单,和正常的快速幂几乎没有差异,用单位矩阵 res 作为初始值直接跑快速幂即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll p=1e9+7;
ll n,k;
ll a[105][105],res[105][105];
void cs(ll x[105][105],ll y[105][105]){
    ll ls[105][105]={0};
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                ls[i][j]+=x[i][k]*y[k][j];
                ls[i][j]%=p;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            x[i][j]=ls[i][j];
        }
    }
}
void po(ll x[105][105],ll y){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            res[i][j]=0;
            if(i==j){
                res[i][j]=1;
            }
        }
    }
    while(y){
        if(y&1){
            cs(res,x);
        }
        cs(x,x);
        y>>=1;
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    po(a,k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<res[i][j]<<" ";
        }
        cout<<"\n";
    }
}
posted @ 2026-07-13 20:34  MistyPost  阅读(10)  评论(1)    收藏  举报