问题描述
给定一个 N N N阶矩阵 A A A,输出 A A A的 M M M次幂( M M M是非负整数)
例如:
A A A =
1 2
3 4
A A A的2次幂
7 10
15 22
输入格式
第一行是一个正整数 N N N、 M M M(1<= N N N<=30, 0<= M M M<=5),表示矩阵 A A A的阶数和要求的幂数
接下来 N N N行,每行 N N N个绝对值不超过10的非负整数,描述矩阵 A A A的值
输出格式
输出共 N N N行,每行 N N N个整数,表示 A A A的 M M M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
【内心 o s os os:看到这个题目,就想起大佬常说的矩阵快速幂,但,,奈何不会呀!只能老老实实用线代中的只是解决了(其实还是偷学了一点点应用到代码中)】
个人思路:用一个结构体存储二维数组,即矩阵,然后就直接矩阵乘法了,感觉还是挺简单的;需要注意一下对于幂数的判断, m = 0 m = 0 m=0或 m = 1 m = 1 m=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;
}