Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) {
new Task().solve() ;
}
}
class Task{
InputReader in = new InputReader(System.in) ;
PrintWriter out = new PrintWriter(System.out) ;
int Mod ;
int size ;
class Mat{
int[][] val ;
Mat(){
val = new int[size+1][size+1] ;
}
Mat E(){
for(int i = 1 ; i <= size ; i++){
Arrays.fill(val[i] , 0) ;
val[i][i] = 1 ;
}
return this ;
}
Mat O(){
for(int i = 1 ; i <= size ; i++){
Arrays.fill(val[i] , 0) ;
}
return this ;
}
}
Mat mult(Mat A , Mat B){
Mat S = new Mat().O() ;
for(int i = 1 ; i <= size ; i++){
for(int j = 1 ; j <= size ; j++){
for(int k = 1 ; k <= size ; k++){
S.val[i][j] = (S.val[i][j] + A.val[i][k] * B.val[k][j]) % Mod ;
}
}
}
return S ;
}
Mat pow(Mat A , int k){
Mat S = new Mat().E() ;
for(; k > 0 ; k >>= 1){
if((k & 1) > 0)
S = mult(S , A) ;
A = mult(A , A) ;
}
return S ;
}
void solve(){
int n = in.nextInt() ;
int k = in.nextInt() ;
Mod = in.nextInt() ;
int[][] a = new int[n+1][n+1] ;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++) a[i][j] = in.nextInt() ;
}
size = n<<1 ;
Mat A = new Mat().O() ;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
A.val[i][j] = a[i][j] ;
}
A.val[n+i][i] = A.val[n+i][n+i] = 1 ;
}
Mat T = pow(A , k+1) ;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
a[i][j] = T.val[n+i][j] ;
}
a[i][i] = (a[i][i] - 1 + Mod) % Mod ;
}
for(int i = 1 ; i <= n ; i++){
out.print(a[i][1]) ;
for(int j = 2 ; j <= n ; j++)
out.print(" " + a[i][j]) ;
out.println() ;
}
out.flush() ;
}
}
class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = new StringTokenizer("");
}
private void eat(String s) {
tokenizer = new StringTokenizer(s);
}
public String nextLine() {
try {
return reader.readLine();
} catch (Exception e) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String s = nextLine();
if (s == null)
return false;
eat(s);
}
return true;
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}