G03【模板】矩阵快速幂_哔哩哔哩_bilibili
矩阵 - OI Wiki
P3390 【模板】矩阵快速幂 - 洛谷
// 矩阵快速幂 O(n^3*logk)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1000000007;
LL n,k;
struct matrix{
LL c[101][101];
matrix(){memset(c,0,sizeof c);}
}A,res;
void mul(matrix &z,matrix &x,matrix &y){
matrix t; //临时矩阵
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
z=t;
}
void qsm(LL k){
for(int i=1;i<=n;i++) res.c[i][i]=1; //单位矩阵
while(k){
if(k&1) mul(res,res,A); //矩阵乘法
mul(A,A,A);
k>>=1;
}
}
int main(){
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%d",&A.c[i][j]);
qsm(k);//矩阵快速幂
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)printf("%d ",res.c[i][j]);
puts("");
}
return 0;
}
// 矩阵快速幂 O(n^3*logk)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1000000007;
LL n,k;
struct matrix{
LL c[101][101];
matrix(){memset(c,0,sizeof c);}
}A,res;
matrix operator*(matrix &x,matrix &y){
matrix t; //临时矩阵
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
return t;
}
void qsm(LL k){
for(int i=1;i<=n;i++) res.c[i][i]=1; //单位矩阵
while(k){
if(k&1) res=res*A; //矩阵乘法
A=A*A;
k>>=1;
}
}
int main(){
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%d",&A.c[i][j]);
qsm(k);//矩阵快速幂
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)printf("%d ",res.c[i][j]);
puts("");
}
return 0;
}