游客 Signup | Login
中文 | En

3006 - 【验证型】第11章:指针和数组 矩阵相乘

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

Input

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

Output

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

Examples

Input

2 2
1 2
3 4

Output

7 10
15 22

Solution C++

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
	int N, M;
	cin >> N >> M;
	int *Array = (int *)calloc(N*N, sizeof(int));
	int *R_Array = (int *)calloc(N*N, sizeof(int));
	int *R = (int *)calloc(N*N, sizeof(int));
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			cin >> Array[i*N+j];
			R_Array[i*N+j] = Array[i*N+j];
			R[i*N+j] = Array[i*N+j];
		}
	} 
	if(M == 0)
	{
		for(int i = 0; i < N; i++)
		{
			for(int j = 0; j < N; j++)
			{
				if(i == j) R_Array[i*N+j] = 1;
				else R_Array[i*N+j] = 0;
			}
		}
	}
	else
	{
		for(int k = 1; k < M; k++)
	    {
		    for(int i = 0; i < N; i++)
	        {
			    for(int j = 0; j < N; j++)
			    {
				    R[i*N+j] = 0;
				    for(int r = 0; r < N; r++)
				    {
					    R[i*N+j] += R_Array[i*N+r] * Array[r*N+j];
				    }
			    }
		    }
		    for(int i = 0; i < N; i++)
		    {
			    for(int j = 0; j < N; j++)
			    {
				    R_Array[i*N+j] = R[i*N+j];
			    }
	     	}
	    }
	}
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			if(j == N-1) 
			{
				cout << R_Array[i*N+j];
				break;
			}
			cout << R_Array[i*N+j] << " ";
		}
		cout << endl;
	} 
	free(Array);
	free(R_Array);
	free(R);
	return 0;
} 
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题