题目是矩阵快速幂,使用结构体写编译器炸了。
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007ll;
struct Matrix {
int r, c;
long long a[210][210];
Matrix multi(Matrix m) {
Matrix res;
res.r = this->r;
res.c = m.c;
for (int i = 1; i <= res.r; ++i) {
for (int j = 1; j <= res.c; ++j) {
res.a[i][j] = 0ll;
}
}
for (int i = 1; i <= this->r; ++i) {
for (int k = 1; k <= this->c; ++k) {
if (this->a[i][k] == 0ll) {
continue;
}
for (int j = 1; j <= m.c; ++j) {
res.a[i][j] += this->a[i][k] * m.a[k][j] % MOD;
res.a[i][j] %= MOD;
}
}
}
return res;
}
void input(void) {
for (int i = 1; i <= this->r; ++i) {
for (int j = 1; j <= this->c; ++j) {
scanf("%lld", &this->a[i][j]);
}
}
}
void output(void) {
for (int i = 1; i <= this->r; ++i) {
for (int j = 1; j <= this->c; ++j) {
printf("%lld", this->a[i][j]);
putchar(j == this->c ? '\n' : ' ');
}
}
}
};
int main(void) {
int n, k;
scanf("%d%d", &n, &k);
Matrix m;
m.r = m.c = n;
m.input();
Matrix res;
res.r = res.c = n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
res.a[i][j] = (i == j ? 1 : 0);
}
}
while (k != 0) {
if (k & 1) {
res = res.multi(m);
}
m = m.multi(m);
k >>= 1;
}
res.output();
return 0;
}