专栏首页开心的学习之路基础练习 矩阵乘法

基础练习 矩阵乘法

问题描述

  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)   例如:   A =   1 2   3 4   A的2次幂   7 10   15 22

输入格式

  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数   接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值

输出格式

  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开

样例输入

2 2 1 2 3 4

样例输出

7 10 15 22 思路:         由于矩阵都是方阵,所以不需要考虑每次相乘的两个矩阵的顺序,大大降低了题的难度,按照矩阵乘法规则递归调用求解。也可以重载" * ",下面只给出了主要代码。

//#define LOCAL
#include <cstdio>
#include <cstring>
#define MAX_X 30
#define MAX_Y 30

int n, m;
struct Matrix
{
	int x, y;  //角标
	int a[MAX_X][MAX_Y]; //内容 
	void clear()
	{
		x = y = 0;
		memset(a, 0, sizeof(a));
	}
};

void PrintMatrix(Matrix &a, int n)
{
	for(int i = 0; i < n; i++)
	{	
		int first = 1;
		for(int j = 0; j < n; j++)
		{
			if(first)
			{
				printf("%d", a.a[i][j]);
				first = 0;
			}
			else
			{
				printf(" %d", a.a[i][j]);
			}
		}
		printf("\n");
	}
}

Matrix Multiplication(Matrix &a, Matrix &b)   //n:阶数  , count:幂 -1
{
	Matrix tmp;
	tmp.clear();   //初始化矩阵 
	for(int k = 0; k < n; ++k)  //k:积矩阵行
	{
		for(int x = 0; x < n; ++x) 
		{
			for(int y = 0; y < n; ++y)
			{
				tmp.a[k][x] += a.a[k][y] * b.a[y][x];
			}
		}
	} 

	return tmp;
}

int main()
{
#ifdef LOCAL
	freopen("input3.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	Matrix a, ans;
	scanf("%d", &n);
	scanf("%d", &m);
	a.x = a.y = n; 
	for(int i = 0; i < a.x; i++)
	{
		for(int j = 0; j < a.y; j++)
		{
			scanf("%d", &a.a[i][j]);
			ans.a[i][j] = a.a[i][j];
		}
	}
	if(m == 0)
	{
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				ans.a[i][j] = (i == j) ? 1 : 0;	
			}	
		}	
	} 
	else
	{
		for(int i = 0; i < m-1; i++)
		{
			ans = Multiplication(ans, a);
		}
	}
	PrintMatrix(ans, n);
	return 0;
}
struct Matrix
{
	int n, m;
	int a[MAXN][MAXM];
	void clear()
	{
		n = m = 0;
		memset(a, 0, sizeof(a));
	}
	Matrix operator * (const Matrix &b) const
	{
		Matrix tmp;
		tmp.clear();
		tmp.n = n;
		tmp.m = b.m;
		for(int i = 0; i < n; ++i)
		{
			for(int j = 0; j< b.m; ++j)
			{
				for(int k = 0; k < m; ++k)
				{
					tmp.a[i][j] += a[i][k] * b.a[k][j];
				}
			}
		}
		return tmp;
	}
};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基础练习 字母图形

    ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC

    刘开心_1266679
  • 基础练习 阶乘计算

      n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推...

    刘开心_1266679
  • 最大公约数和最小公倍数

           辗转相除法(欧几里得算法)算是求最大公约数最简单高效的算法了,这几行代码用最简洁的方式写了这个算法,值得牢牢记住:

    刘开心_1266679
  • BZOJ4128: Matrix(BSGS 矩阵乘法)

    第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B

    attack
  • PTA 输出全排列(20 分)

    7-2 输出全排列(20 分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。 输入格式: ...

    Kindear
  • 挑战程序竞赛系列(3):2.3需要思考的动规

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • codeforces736D. Permutations(线性代数)

    attack
  • P1538 迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列。 为了配合每...

    attack
  • 构造蛇形矩阵

    1  2  3 8  9  4 7  6  5 n=4的回型矩阵 1  2  3  4 12  13  14  5 11  16  15  6 10  9 ...

    week
  • 洛谷P4013 数字梯形问题(费用流)

    梯形的第一行有 mmm 个数字。从梯形的顶部的 mmm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。

    attack

扫码关注云+社区

领取腾讯云代金券