思路
這是一道模板題!!
矩陣快速冪是一個重要的東西,我們可以用普通的快速冪來做,重載一下運算符(dalao題解),然后就可以做了
推薦這篇題解
代碼
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
#define N 110
#define MOD 1000000007
using namespace std;
inline int read() {
char c=getchar();
int x=0,f=1;
while(c<'0'||c>'9') {
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
return x*f;
}
int n,k;
struct node {
int a[N][N];
node() {
memset(a,0,sizeof(a));
}
inline void build() {
for(int i=1; i<=n; i++)a[i][i]=1;
}
} a;
node operator *(const node &x, const node &y) {
node z;
for(int k=1; k<=n; k++) {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%MOD)%MOD;
}
}
}
return z;
}
node ans;
void power() {
while(k) {
if(k&1)ans=ans*a;
a=a*a;
k>>=1;
}
}
signed main() {
n=read();
k=read();
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
a.a[i][j]=read();
}
}
ans.build();
power();
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cout<<ans.a[i][j]<<" ";
}
cout<<'\n';
}
return 0;
}