//数据小于32768
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 40;
typedef long long ll;
struct Mat {
int mat[maxn][maxn];
int row,col;
};
Mat mod_add(Mat a, Mat b, int p){
Mat ans;
ans.row = a.row ;
ans.col = a.col ;
memset(ans.mat ,0, sizeof (ans.mat ));
for (int i = 0; i < ans.row ; i++){
for (int j = 0; j < ans.col ; j++){
ans.mat [i][j] = (a.mat [i][j] +b.mat [i][j]) % p;
}
}
return ans;
}
Mat mod_mul(Mat a, Mat b, int p){
Mat ans;
ans.row = a.row ;
ans.col = b.col ;
memset(ans.mat ,0, sizeof(ans.mat ));
for (int i = 0; i < ans.row ; i++){
for (int j = 0; j < ans.col ; j++){
for (int k = 0; k < a.col; k++){
ans.mat [i][j] += a.mat [i][k] * b.mat [k][j];
ans.mat [i][j] %= p; //根据题意,需%p;
}
}
}
return ans;
}
Mat mod_pow(Mat a, int k, int p) {//k次幂,%p
Mat ans;
ans.row = a.row ;
ans.col = a.col ;
for (int i = 0; i < a.row ; i++){
for (int j = 0; j < a.col ; j++){
ans.mat [i][j] = (i == j);
}
}
while (k){
if (k & 1) ans = mod_mul(ans,a,p);
a = mod_mul(a,a,p);
k >>= 1;
}
return ans;
}
Mat a, I;
int n,k,m;
Mat solve(int n, int k, int m){
Mat ans,b;
b.col = b.row = n;
if (k == 1) return a;
if (k % 2 == 0){
b = mod_add(I , mod_pow(a,k/2,m),m);
ans = mod_mul(solve(n,k/2,m),b,m);
}
if (k % 2 == 1){
b = mod_add(I , mod_pow(a,k/2,m),m);
ans = mod_mul(solve(n,k/2,m),b,m);
ans = mod_add(ans, mod_pow(a,k,m), m);
}
return ans;
}
int main (){
Mat ans;
scanf("%d%d%d", &n, &k, &m);
a.col = a.row = I.col = I.row = n;
for (int i = 0; i < a.row ; i++){
for (int j = 0; j < a.col ; j++){
scanf(" %d", &a.mat [i][j]);
I.mat [i][j] = (i==j);
}
}
a = solve(n,k,m);
for (int i = 0; i < a.row ; i++){
printf("%d",a.mat [i][0]);
for (int j = 1; j < a.col ; j++){
printf(" %d", a.mat [i][j]);
}
printf("\n");
}
}
搞清楚返回值的含义,自己定义个函数把自己搞蒙了