1 #include <iostream>
2 #include <cstdio>
3 #include <string>
4 #include <cstring>
5 #include <stdlib.h>
6 #include <math.h>
7 #include <ctype.h>
8 #include <queue>
9 #include <map>
10 #include <set>
11 #include <algorithm>
12
13 using namespace std;
14 int mod;
15 int n;
16 struct matrix
17 {
18 int ma[40][40];
19 }init, res;
20 matrix Mult(matrix x, matrix y)
21 {
22 int i,j,k;
23 matrix tmp;
24 memset(tmp.ma,0,sizeof(tmp.ma));
25 for(i=0;i<n;i++)
26 for(j=0;j<n;j++)
27 for(k=0;k<n;k++)
28 tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
29 return tmp;
30 }
31 matrix Pow(matrix x, int k)
32 {
33 matrix tmp;
34 int i,j;
35 memset(tmp.ma,0,sizeof(tmp.ma));
36 for(i=0;i<n;i++) tmp.ma[i][i]=1;
37 while(k){
38 if(k&1) tmp=Mult(tmp,x);
39 x=Mult(x,x);
40 k>>=1;
41 }
42 return tmp;
43 }
44 matrix add(matrix x, matrix y)
45 {
46 int i, j;
47 matrix tmp;
48 for(i=0;i<n;i++)
49 for(j=0;j<n;j++)
50 tmp.ma[i][j]=(x.ma[i][j]+y.ma[i][j])%mod;
51 return tmp;
52 }
53 matrix sum(matrix x, int k)
54 {
55 matrix tmp, y;
56 if(k==1) return x;
57 tmp=sum(x,k/2);
58 if(k&1){
59 y=Pow(x,k/2+1);
60 tmp=add(Mult(y,tmp),tmp);
61 return add(tmp,y);
62 }
63 else{
64 y=Pow(x,k/2);
65 return add(Mult(y,tmp),tmp);
66 }
67 }
68 int main()
69 {
70 int k,m,x,i,j;
71 scanf("%d%d%d",&n,&k,&mod);
72 for(i=0;i<n;i++){
73 for(j=0;j<n;j++){
74 scanf("%d",&x);
75 init.ma[i][j]=x%mod;
76 }
77 }
78 res=sum(init, k);
79 for(i=0;i<n;i++){
80 for(j=0;j<n;j++){
81 printf("%d",res.ma[i][j]);
82 if(j!=n-1) printf(" ");
83 }
84 puts("");
85 }
86 return 0;
87 }