#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 35; int n, k, m; struct Mat{ ll mat[maxn][maxn]; Mat(){ memset(mat, 0, sizeof(mat)); } }; Mat mul(Mat a, Mat b, int n, int mod){ Mat ans; for(int i=0; i<n; i++){ for(int k=0; k<n; k++){ for(int j=0; j<n; j++){ ans.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%mod; } } } return ans; } Mat pow(Mat a, int b, int n, int mod){ Mat ans; for(int i=0; i<n; i++) ans.mat[i][i] = 1; while(b){ if(b&1){ ans = mul(ans, a, n, mod); } a = mul(a, a, n, mod); b >>= 1; } return ans; } Mat add(Mat a, Mat b, int n, int mod){ Mat ans; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ ans.mat[i][j] = (a.mat[i][j]+b.mat[i][j])%mod; } } return ans; } Mat sum(Mat a, int k, int n, int mod){ if(k == 1) return a; Mat half_sum = sum(a, k/2, n, mod); Mat ans; if(k&1){ Mat a1 = pow(a, k/2+1, n, mod); ans = add(half_sum, mul(half_sum, a1, n, mod), n, mod); ans = add(ans, a1, n, mod); } else{ Mat a1 = pow(a, k/2, n, mod); ans = add(half_sum, mul(half_sum, a1, n, mod), n, mod); } return ans; } int main() { while(~scanf("%d%d%d",&n, &k, &m)){ Mat ma; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ scanf("%d", &ma.mat[i][j]); } } Mat ans = sum(ma, k, n, m); for(int i=0; i<n; i++){ int j=0; for(j=0; j<n-1; j++){ printf("%d ", ans.mat[i][j]); } printf("%d\n", ans.mat[i][j]); } } return 0; }
|