当前位置:   article > 正文

蓝桥杯之矩阵乘法_算法训练 矩阵乘法

算法训练 矩阵乘法

【解析】
这题的规模很小,直接暴力计算矩阵的 n n n次幂即可,但是为了练习一下快速幂,我就用的快速幂的方法。
将矩阵做成一个结构体/类,用二维数组存放值,别忘了用于矩阵初始化的构造函数。

【代码】

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 100 + 10;
int m, n;
struct Matrix {
	int M[maxn][maxn];
	Matrix() { memset(M, 0, sizeof(M)); }
	Matrix(int t) {
		for (int i = 0;i < m;i++) {
			for (int j = 0;j < m;j++) {
				if (i == j) M[i][j] = 1;
				else M[i][j] = 0;
			}
		}
	}
};
Matrix mul(Matrix a, Matrix b)
{
	Matrix c;
	for (int i = 0;i < m;i++)
		for (int j = 0;j < m;j++)
			for (int k = 0;k < m;k++)
				c.M[i][j] += a.M[i][k] * b.M[k][j];
	return c;
}
Matrix quickPow(Matrix a, int k)
{
	if (!k) return Matrix(1);
	Matrix res = a;
	int ex = 1;
	while ((ex << 1) <= k) {
		res = mul(res, res);
		ex <<= 1;
	}
	return mul(res, quickPow(a, k - ex));
}
int main()
{
	while (cin >> m >> n)
	{
		Matrix mm, t;
		for (int i = 0;i < m;i++)
			for (int j = 0;j < m;j++)
				cin >> mm.M[i][j];
		t = quickPow(mm, n);
		for (int i = 0;i < m;i++) {
			for (int j = 0;j < m;j++)
				cout << t.M[i][j] << ' ';
			cout << endl;
		}
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/64402
推荐阅读
相关标签
  

闽ICP备14008679号