矩阵乘法
单位矩阵
很明显的可以推知,任何矩阵乘以单位矩阵,其值不改变。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
typedef long long ll;
const int NI = 15;
struct Mat {
ll mat[NI][NI];
} a;
int n, k;
Mat operator * (Mat a, Mat b) {
Mat c;
memset(c.mat, 0, sizeof(c.mat));
for(int i = 0; i < n; i++) {
for(int k = 0; k < n; k++) {
for(int j = 0; j < n; j++) {
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
}
}
}
return c;
}
Mat operator ^ (Mat a, int k) {
Mat c;
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
c.mat[i][j] = (i == j); //初始化为单位矩阵
while(k) {
if(k&1) c = c * a;
a = a * a;
k >>= 1;
}
return c;
}
istream & operator >> (istream & cin, Mat &a) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%I64d", &a.mat[i][j]);
}
}
return cin;
}
ostream & operator << (ostream & cout, Mat a) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%I64d ", a.mat[i][j]);
}
printf("\n");
}
return cout;
}
int main() {
while(~scanf("%d%d", &n, &k)) {
cin >> a;
cout << (a ^ k);
}
return 0;
}