#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 31;
struct Matrix{
int m[maxn][maxn];
};
int n, k, m;
Matrix mul(Matrix a, Matrix b){
Matrix res;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
res.m[i][j] = 0;
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
res.m[i][j] = (res.m[i][j] + (a.m[i][k] * b.m[k][j]) % m) % m;
}
}
}
return res;
}
Matrix poww(Matrix a, int k){
Matrix tmp;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i == j) tmp.m[i][j] = 1;
else tmp.m[i][j] = 0;
}
}
while(k){
if(k & 1) tmp = mul(tmp, a);
a = mul(a, a);
k >>= 1;
}
return tmp;
}
Matrix add(Matrix a, Matrix b){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
a.m[i][j] = (a.m[i][j] + b.m[i][j]) % m;
}
}
return a;
}
Matrix solve(Matrix a, int k){
if(k == 1) return a;
else {
Matrix tmp = solve(a, k / 2);
if(k & 1) return add(add(tmp, mul(poww(a, k / 2), tmp)), poww(a, k));
else return add(tmp, mul(poww(a, k / 2), tmp));
}
}
int main()
{
Matrix a;
cin >> n >> k >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> a.m[i][j];
a.m[i][j] %= m;
}
}
Matrix ans = solve(a, k);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cout << ans.m[i][j] << ' ';
}
cout << endl;
}
return 0;
}
POJ-3233 二分+矩阵快速幂
猜你喜欢
转载自blog.csdn.net/jiangkun0331/article/details/97821904
今日推荐
周排行