显示代码纯文本
#include <bits/stdc++.h>
#define ll __int128
#define Tairitsu fast_pow
#define Tempest return 0;
using namespace std;
ll n, k, mod;
ll read() {
ll sum = 0, fl = 1;
int ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-') fl = -1;
for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0';
return sum * fl;
}
void write(ll x) {
static ll sta[40];
int top = 0;
do {
sta[top++] = x % 10, x /= 10;
} while (x);
while (top) putchar(sta[--top] + 48);
putchar(' ');
}
struct Matrix {
ll a[40][40];
void Clear() {
memset(a, 0, sizeof a);
}
void Print() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
write(a[i][j]);
}
printf("\n");
}
}
Matrix operator * (Matrix y) {
Matrix res;
res.Clear();
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= n; ++k) {
res.a[i][j] += a[i][k] % mod * y.a[k][j] % mod;
res.a[i][j] %= mod;
}
}
}
return res;
}
Matrix operator + (Matrix y) {
Matrix res;
res.Clear();
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
res.a[i][j] = a[i][j] % mod + y.a[i][j] % mod;
res.a[i][j] %= mod;
}
}
return res;
}
Matrix operator - (Matrix y) {
Matrix res;
res.Clear();
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
res.a[i][j] = a[i][j] - y.a[i][j];
res.a[i][j] = ((res.a[i][j] % mod) + mod) % mod;
}
}
return res;
}
};
struct Matrix2 {
Matrix a[3][3];
void Clear() {
for (int i = 1; i <= 2; ++i) {
for (int j = 1; j <= 2; ++j) {
a[i][j].Clear();
}
}
}
Matrix2 operator * (Matrix2 y) {
Matrix2 res;
res.Clear();
for (int i = 1; i <= 2; ++i) {
for (int j = 1; j <= 2; ++j) {
for (int k = 1; k <= 2; ++k) {
res.a[i][j] = res.a[i][j] + (a[i][k] * y.a[k][j]);
}
}
}
return res;
}
};
Matrix2 Tairitsu(Matrix2 x, ll y) {
Matrix2 res = x;
y--;
while (y) {
if (y & 1) res = res * x;
y >>= 1;
x = x * x;
}
return res;
}
Matrix A, E, O;
Matrix2 M;
Matrix X;
int main() {
n = read(), k = read(), mod = read();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
A.a[i][j] = read();
A.a[i][j] %= mod;
}
E.a[i][i] = 1;
}
M.a[1][1] = A, M.a[1][2] = E, M.a[2][1] = O, M.a[2][2] = E;
(Tairitsu(M, k + 1).a[1][2] - E).Print();
Tempest
}