#include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; /** * 矩阵维数 */ const int DIMENSION = 10; /** * 矩阵 */ struct Matrix { int row; //矩阵的行 int col; //矩阵的列 int matrix[DIMENSION][DIMENSION]; //二维数组模拟矩阵 //构造函数 Matrix(int row, int col) { this->row = row; this->col = col; } }; /** * 矩阵乘法 * @param x * @param y * @return */ Matrix multiply(Matrix x, Matrix y); /** * 矩阵求幂 * @param x * @return */ Matrix quickPower(Matrix x, int n); /** * 打印矩阵 * @param x */ void printMatrix(Matrix x); /** * 矩阵幂--北京邮电大学 * @return */ int main() { int n; int k; while (cin >> n >> k) { Matrix x = Matrix(n, n); for (int i = 0; i < x.row; ++i) { for (int j = 0; j < x.col; ++j) { cin >> x.matrix[i][j]; } } Matrix ans = quickPower(x, k); printMatrix(ans); } return 0; } Matrix multiply(Matrix x, Matrix y) { //矩阵乘法结果是x的行和y的列 Matrix ans(x.row, y.col); for (int i = 0; i < ans.row; ++i) { for (int j = 0; j < ans.col; ++j) { //先初始化为0 ans.matrix[i][j] = 0; /* * 根据矩阵相乘的规则 * matrix[i][j] = x的第i行与y的第j列对应的乘积和 */ for (int k = 0; k < x.col; ++k) { ans.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j]; } } } return ans; } void printMatrix(Matrix x) { //注意题目明确的输出格式 for (int i = 0; i < x.row; ++i) { for (int j = 0; j < x.col; ++j) { if (j == 0) { //第一列不带空格 cout << x.matrix[i][j]; } else { //非第一列带前置空格 cout << " " << x.matrix[i][j]; } } cout << endl; } } Matrix quickPower(Matrix x, int n) { Matrix ans = Matrix(x.row, x.col); //初始化为单位阵 for (int i = 0; i < ans.row; ++i) { for (int j = 0; j < ans.col; ++j) { if (i == j) { ans.matrix[i][j] = 1; } else { ans.matrix[i][j] = 0; } } } /* * 求快速幂的方法 */ while (n != 0) { if (n % 2 == 1) { ans = multiply(ans, x); } n = n >> 1; x = multiply(x, x); } return ans; }