做法: 矩阵乘法中做矩阵乘法。
WA 50 pts。
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
const int N = 35;
int n, m, k;
struct SQ { int q[N][N]; };
SQ mul2 (SQ d, SQ a, SQ b) {
SQ c;
memset (c.q, 0, sizeof c.q);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
c.q[i][j] = (c.q[i][j] + a.q[i][k] * b.q[k][j] % m) % m;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
d.q[i][j] = (d.q[i][j] + c.q[i][j]) % m;
return d;
}
void mul (SQ s[2], SQ a[2][2]) {
SQ c[2];
for (int i = 0; i < 2; i++) memset (c[i].q, 0, sizeof c[i].q);
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++) {
c[j] = mul2 (c[j], s[k], a[k][j]);
}
memcpy (s, c, sizeof c);
}
void mulself (SQ a[2][2]) {
SQ c[2][2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
memset (c[i][j].q, 0, sizeof c[i][j].q);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
c[i][j] = mul2 (c[i][j], a[i][k], a[k][j]);
memcpy (a, c, sizeof c);
}
signed main ()
{
ios::sync_with_stdio (false);
cin.tie (0); cout.tie (0);
SQ s[2], a[2][2];
cin >> n >> k >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
cin >> s[1].q[i][j]; s[1].q[i][j] %= m;
if (i == j) a[1][0].q[i][j] = a[1][1].q[i][j] = 1;
a[0][0].q[i][j] = s[1].q[i][j];
}
for (; k; k >>= 1) {
if (k & 1) mul (s, a);
mulself (a);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << s[0].q[i][j] << ' ';
cout << '\n';
}
return 0;
}