储备知识:
矩阵:
矩阵的乘法:
也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。 矩阵的n次幂同理。不过是自己乘自己。
本题注意点:
1、矩阵是有0阶的!矩阵是有0阶的!!矩阵是有0阶的!!!(数学不好的我哭晕在厕所o(╥﹏╥)o)
类似这样:
2、还有啊,笔者想了好久,也没有更优化的方案,如果有好想法的同学,可以分享一下。不吝赐教。 Thanks♪(・ω・)ノ
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m; //n阶m次幂
cin >> n >> m;
int a[n][n], b[n][n], c[n][n]; memset(c,0,sizeof(c)); //置0
for(int i = 0; i < n; i++) //输入
for(int j = 0; j < n; j++)
cin >> a[i][j]; b[i][j] = a[i][j];
if(m == 0) //阶数为0的情况
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
i==j ? a[i][j] = 1 : a[i][j] = 0;
m--;
while(m-- > 0) { //阶数不为0
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
c[i][j] += a[i][k]*b[k][j];
memcpy(a,c,sizeof(c)); memset(c,0,sizeof(c));
}
for(int i = 0; i < n; i++) { //输出
for(int j = 0; j < n; j++)
cout << a[i][j] << ' ';
cout << endl; }
return 0;
}