构造一个左上角是A+A2+A3 …的矩阵,然后去算就可以了
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
typedef int Matrix[77][77];
Matrix tt;
int n, k, m;
void mul(const Matrix& a,const Matrix& b, Matrix &res) {
for(int i = 0; i < 2 * n; i++)
for (int j = 0; j < 2 * n; j++) {
tt[i][j] = 0;
for (int k = 0; k < 2 * n; k++)
tt[i][j] += a[i][k] * b[k][j], tt[i][j] %= m;
}
for (int i = 0; i < 2 * n; i++)
for (int j = 0; j < 2 * n; j++)
res[i][j] = tt[i][j];
}
Matrix a,b;
int main() {
scanf("%d%d%d", &n, &k, &m);
k--;//这里也可以k不减,然后把a变成1,直接算就行了
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &a[i][j]), a[i][j] %= m, a[i][j + n] = a[i][j];
for (int i = 0; i < n; i++)
b[i][i] = 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
b[i + n][j] = b[i + n][j + n] = a[i][j];
while (k) {
if (k & 1)
mul(a, b, a);
mul(b, b, b);
k >>= 1;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}