版权声明: https://blog.csdn.net/qq_40829288/article/details/89443229
错误代码
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 31;
int n, k, mod;
struct mat {
int arr[maxn][maxn];
mat() {
memset(arr, 0, sizeof(arr));
}
};
mat add(mat a, mat b) {
mat c;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c.arr[i][j] = a.arr[i][j] + b.arr[i][j];
if (c.arr[i][j] >= mod) {
c.arr[i][j] %= mod;
}
}
}
return c;
}
mat mul(mat a, mat b) {
mat ret;
for (int i = 0; i < n; i++) {
for (int k = 0; k < n; k++) {
if (a.arr[i][k]) {
for (int j = 0; j < n; j++) {
ret.arr[i][j] += a.arr[i][k] * b.arr[k][j];
if (ret.arr[i][j] >= mod)
ret.arr[i][j] %= mod;
}
}
}
}
return ret;
}
mat power(mat p, int k) {
if (k == 1)
return p;
mat e;
for (int i = 0; i < n; i++) {
e.arr[i][i] = 1;
}
if (k == 0)
return e;
while (k) {
if (k & 1)
e = mul(p, e);
p = mul(p, e);
k >>= 1;
}
return e;
}
mat cal(mat ori, int k) {
if (k == 1) {
return ori;
}
if (k & 1) {
return add(cal(ori, k - 1), power(ori, k));
}
return mul(add(power(ori, 0), power(ori, k >> 1)), cal(ori, k >> 1));
}
//void output(mat ans) {
// for(int i = 0;i < n;i++) {
// for(int j = 0;j < n;j++) {
// if(j<n-1) {
// printf("%d ",ans.arr[i][j]);
// } else {
// printf("%d\n",ans.arr[i][j]);
// }
// }
// }
//}
void output(mat ans) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if (j == n - 1)
cout << ans.arr[i][j] << endl;
else
cout << ans.arr[i][j] << " ";
}
}
int main() {
mat ori, ans;
while (scanf("%d%d%d", &n, &k, &mod) != EOF) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &ori.arr[i][j]);
if (ori.arr[i][j] >= mod) {
ori.arr[i][j] %= mod;
}
}
}
ans = cal(ori, k);
output(ans);
}
return 0;
}