Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.
Output the elements of S modulo m in the same way as A is given.
2 2 4 0 1 1 1Sample Output
1 2 2 3
//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
using namespace std;
int mod;
#define f(i,n) for(i=0;i<n;i++)
typedef vector<int> vec;
typedef vector<vec> mat;
mat mul(mat &a,mat &b){
mat c(a.size(),vec(b[0].size()));
int i,j,k;
f(i,a.size())
f(k,b.size())
f(j,b[0].size())
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;
return c;
}
typedef long long ll;
mat pow(mat a,ll n){
mat b(a.size(),vec(a.size()));
int i,j;
f(i,a.size())b[i][i]=1;
while(n>0){
if(n&1)b=mul(b,a);
a=mul(a,a);
n/=2;
}
return b;
}
int main(){
//freopen("in.txt","r",stdin);
int n,k;
cin>>n>>k>>mod;
mat b(n*2,vec(n*2));
int i,j;
f(i,n){
f(j,n)
cin>>b[i][j];
b[i+n][i]=b[n+i][n+i]=1;
}
b=pow(b,k+1);
f(i,n)f(j,n){
int a=b[n+i][j]%mod;
if(i==j)a=(a+mod-1)%mod;
printf("%d%c",a,j+1==n?'\n':' ');
}
// fclose(stdin);
}