矩阵乘法/快速幂


这就是矩阵乘法的原理,当且仅当 \(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";
}
}
本文来自博客园,作者:MistyPost,转载请注明原文链接。

浙公网安备 33010602011771号