【解析】
这题的规模很小,直接暴力计算矩阵的
n
n
n次幂即可,但是为了练习一下快速幂,我就用的快速幂的方法。
将矩阵做成一个结构体/类,用二维数组存放值,别忘了用于矩阵初始化的构造函数。
【代码】
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 100 + 10;
int m, n;
struct Matrix {
int M[maxn][maxn];
Matrix() { memset(M, 0, sizeof(M)); }
Matrix(int t) {
for (int i = 0;i < m;i++) {
for (int j = 0;j < m;j++) {
if (i == j) M[i][j] = 1;
else M[i][j] = 0;
}
}
}
};
Matrix mul(Matrix a, Matrix b)
{
Matrix c;
for (int i = 0;i < m;i++)
for (int j = 0;j < m;j++)
for (int k = 0;k < m;k++)
c.M[i][j] += a.M[i][k] * b.M[k][j];
return c;
}
Matrix quickPow(Matrix a, int k)
{
if (!k) return Matrix(1);
Matrix res = a;
int ex = 1;
while ((ex << 1) <= k) {
res = mul(res, res);
ex <<= 1;
}
return mul(res, quickPow(a, k - ex));
}
int main()
{
while (cin >> m >> n)
{
Matrix mm, t;
for (int i = 0;i < m;i++)
for (int j = 0;j < m;j++)
cin >> mm.M[i][j];
t = quickPow(mm, n);
for (int i = 0;i < m;i++) {
for (int j = 0;j < m;j++)
cout << t.M[i][j] << ' ';
cout << endl;
}
}
return 0;
}