#include<iostream>
#include<cstring>
#include<cstdio>
#define MOD 1000000007
#define LL long long
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
class Matrix {
public:
Matrix(int n):size(n) {
data = new LL[size * size];
rep(i, 0, size)rep(j, 0, size) data[i * size + j] = 0;
}
~Matrix() { delete[] data; }
Matrix(Matrix& mat) {
size = mat.size;
data = new LL[size * size];
rep(i, 0, size)rep(j, 0, size)data[i * size + j] = mat.data[i * size + j];
}
Matrix& operator =(const Matrix& mat) {
if (this == &mat)return *this;
delete[] data;
size = mat.size;
data = new LL[size * size];
rep(i, 0, size)rep(j, 0, size)data[i * size + j] = mat.data[i * size + j];
return *this;
}
void in() {
rep(i, 0, size)rep(j, 0, size)cin >> data[i * size + j];
}
void out() {
rep(i, 0, size) {
rep(j, 0, size) printf("%lld ", data[i*size+j]);
printf("\n");
}
}
friend Matrix operator*(const Matrix& mat1, const Matrix& mat2) {
int s = mat1.size;
Matrix tmp(s);
rep(i, 0, s)rep(k, 0, s)rep(j, 0, s) {
tmp.data[i * s + j] = (tmp.data[i * s + j] + mat1.data[i * s + k] * mat2.data[k * s + j]%MOD)%MOD;
}
return tmp;
}
friend Matrix operator^( Matrix mat, int power) {
int s = mat.size;
Matrix I(s);
rep(i, 0, s)I.data[i * s + i]=1;
while (power) {
if (power & 1) I = I * mat;
mat=mat*mat;
power = power >> 1LL;
}
return I;
}
private:
int size;
LL* data;
};
int main() {
int n;
LL k;
cin >> n >> k;
Matrix A(n);
A.in();
(A ^ k).out();
}
小数据没问题,但是数组大了,就会 RE 看似无限循环(?), 代码舍不得扔掉,先记在这儿.挖坑待填.