太简单了
跑步的ZJZ那里,我得到了
终于
#include
using namespace std;
const int N = 40;
int n, m, k;
struct Matrix {
int a[N][N];
};
struct node {
Matrix a[3][3];
};
void init_Matrix(Matrix &x) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j)
x.a[i][j] = 1;
else
x.a[i][j] = 0;
}
}
}
void set_Matrix(Matrix &x) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) x.a[i][j] = 0;
}
}
Matrix operator*(Matrix x, Matrix y) {
Matrix ret;
set_Matrix(ret);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= n; k++) {
ret.a[i][j] += x.a[i][k] * y.a[k][j];
ret.a[i][j] %= m;
}
}
}
return ret;
}
Matrix operator+(Matrix x, Matrix y) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
x.a[i][j] = x.a[i][j] + y.a[i][j];
x.a[i][j] %= m;
}
}
return x;
}
void init_node(node &x) {
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 2; j++) {
if (i == j)
init_Matrix(x.a[i][j]);
else
set_Matrix(x.a[i][j]);
}
}
}
void set_node(node &x) {
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 2; j++) set_Matrix(x.a[i][j]);
}
}
node operator*(node x, node y) {
node ret;
set_node(ret);
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 2; j++) {
for (int k = 1; k <= 2; k++) {
Matrix tmp = x.a[i][k] * y.a[k][j];
ret.a[i][j] = ret.a[i][j] + tmp;
}
}
}
return ret;
}
void print(node x) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j >= 1;
}
return ret;
}
int main(void) {
scanf("%d%d%d", &n, &k, &m);
node x;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) scanf("%d", &x.a[1][1].a[i][j]);
init_Matrix(x.a[1][2]);
init_Matrix(x.a[2][2]);
set_Matrix(x.a[2][1]);
x = quickpow_node(x, k + 1);
print(x);
return 0;
}
但是这题样例有问题,所以可以改一下输出
下班