Matrix Power Series
![]()
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF=0x4fffffff;
17 const double EXP=1e-5;
18 const int MS=31;
19 const int SIZE=1000;
20
21 int n,k,mod;
22 typedef vector<vector<int> > mat;
23
24 mat A;
25 // calc A*B
26
27 mat mul(mat &A,mat &B)
28 {
29 mat C(A.size(),vector<int>(B[0].size()));
30
31 for(int i=0;i<A.size();i++)
32 {
33 for(int k=0;k<B.size();k++)
34 {
35 for(int j=0;j<B[0].size();j++)
36 {
37 C[i][j]=(C[i][j]+(LL)A[i][k]*B[k][j])%mod; // note overflow
38 }
39 }
40 }
41 return C;
42 }
43
44 // calc A^n
45
46 mat pow(mat A,int n)
47 {
48 mat B(A.size(),vector<int>(A[0].size()));
49 for(int i=0;i<A.size();i++)
50 B[i][i]=1;
51 while(n>0)
52 {
53 if(n&1)
54 B=mul(B,A);
55 A=mul(A,A);
56 n>>=1;
57 }
58 return B;
59 }
60
61 void solve()
62 {
63 mat B(2*n,vector<int>(2*n)); // init 0
64 // B_init();
65 for(int i=0;i<n;i++)
66 {
67 for(int j=0;j<n;j++)
68 B[i][j]=A[i][j];
69 B[n+i][i]=B[n+i][n+i]=1;
70 }
71 B=pow(B,k+1);
72 // ans=s[k+1]-1;
73 for(int i=0;i<n;i++)
74 {
75 for(int j=0;j<n;j++)
76 {
77 if(j)
78 printf(" ");
79 int a=B[n+i][j]%mod;
80 if(i==j)
81 a=(a+mod-1)%mod;
82 printf("%d",a);
83 }
84 printf("\n");
85 }
86 }
87
88 int main()
89 {
90 scanf("%d%d%d",&n,&k,&mod);
91 A.resize(n);
92 for(int i=0;i<n;i++)
93 A[i].resize(n);
94 for(int i=0;i<n;i++)
95 for(int j=0;j<n;j++)
96 scanf("%d",&A[i][j]);
97 solve();
98 return 0;
99 }