```
struct mat {//定义矩阵结构体
ll m[maxn][maxn];
};
mat operator * (mat a, mat b) {//定义矩阵乘法
mat ans;
ll x = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
x = 0;
for(int k = 0; k < n; k++) {
x = (x + a.m[i][k] * b.m[k][j]) % MOD;
}
ans.m[i][j] = x;
}
}
return ans;
}
mat init(mat &a) {//初始化单位矩阵
for(int i = 0; i < n; i++) {
a.m[i][i] = 1;
}
return a;
}
mat mat_pow(mat a, int n) {//矩阵快速幂
mat ans = init(ans);
while(n) {
if(n & 1) ans = ans * a;
a = a * a;
n >>= 1;
}
return ans;
}
int main() {
while(~scanf("%d%d", &n, &m)) {
mat a;
for(int i = 0; i < n; i++) {//输入矩阵
for(int j = 0; j < n; j++) {
scanf("%lld", &a.m[i][j]);
}
}
a = mat_pow(a, m);
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%lld", a.m[i][j]);
j == n - 1 ? printf("\n") : printf(" ");
}
}
printf("\n");
}
return 0;
}
“`