问题描述
给定一个NNN阶矩阵AAA,输出AAA的MMM次幂(MMM是非负整数)
例如:
AAA =
1 2
3 4
AAA的2次幂
7 10
15 22
输入格式
第一行是一个正整数NNN、MMM(1<=NNN<=30, 0<=MMM<=5),表示矩阵AAA的阶数和要求的幂数
接下来NNN行,每行NNN个绝对值不超过10的非负整数,描述矩阵AAA的值
输出格式
输出共NNN行,每行NNN个整数,表示AAA的MMM次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
【内心ososos:看到这个题目,就想起大佬常说的矩阵快速幂,但,,奈何不会呀!只能老老实实用线代中的只是解决了(其实还是偷学了一点点应用到代码中)】
个人思路:用一个结构体存储二维数组,即矩阵,然后就直接矩阵乘法了,感觉还是挺简单的;需要注意一下对于幂数的判断,m=0m = 0m=0或m=1m = 1m=1这两种特殊情况要单独处理
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m;
struct node {
int a[35][35];
node () {
memset(a, 0, sizeof(a));
}
};
node A,res;
//矩阵乘法
node mul(node ans, node ant) {
node t;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
for (int k = 0; k < n; ++k) {
t.a[i][j] += ans.a[i][k] * ant.a[k][j];
}
}
}
return t;
}
//幂
node mul_m(node ans) {
node h,t;
t = ans;
for (int i = 0; i < m - 1; ++i) {
h = mul(t, ans);
t = h;
}
return t;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> A.a[i][j];
}
}
//原矩阵
if (m == 1) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << A.a[i][j] << " ";
}
cout << endl;
}
}
//单位矩阵
else if (m == 0) {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++){
if(i==j)
cout << 1 << " ";
else
cout << 0 << " ";
}
cout << endl;
}
}
else {
node result;
result = mul_m(A);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << result.a[i][j] << " ";
}
cout << endl;
}
}
return 0;
}