1397 计算矩阵幂

描述

描述很简单:

计算[M*M]^D,其中[M*M]表示一个M*M的矩阵,D是一个正整数;

输入

第一行包含一个整数T,表示有T组数据;

对于每组数据,第一行包含2个整数M,D,意思如题目描述;

然后是一个M×M的矩阵

M不超过10,D不超过100,0000

输出

输出一个M*M的矩阵

考虑到数字可能太大,所以对于每个元素请取模 10000


样例输入
1
1 1
1
样例输出
1



此题需要用到二分法

比如矩阵A, A的n次方A^n ,

当n为偶数时,A^n= A^(n/2 + n/2) = A^(n/2) * A^(n/2),

当n为奇数时,A^n= A^(n/2 + n/2 + 1) = A^(n/2) * A^(n/2) * A,


#include <iostream>
#include <cstdio>
using namespace std;

int T;
int n, k;

typedef struct Matrix
{
	int ma[15][15];
}Matrix;

Matrix A;   // 矩阵A
Matrix B;   // 保存最后的结果
Matrix unit;// 单位矩阵,用于在下面的fun函数中
const int MOD = 10000;

// 两个矩阵相乘
Matrix Mul(Matrix m1, Matrix m2)
{
	Matrix c;
	for(int i=0; i<n; ++i)
		for(int j=0; j<n; ++j)
		{
			c.ma[i][j] = 0;
			for(int k=0; k<n; ++k)
				c.ma[i][j] += m1.ma[i][k] * m2.ma[k][j];
			c.ma[i][j] %= MOD;
		}
		return c;
}

// 二分法求矩阵的幂
// 这个函数自己把num设为一个值,试试,推荐num=27
void fun(int num)
{
	Matrix in = A;
	Matrix un = unit;

	while(num > 1)
	{
		if(num & 1)  // 为奇数时,则减一
		{
			--num;
			un = Mul(in, un);   // 这里可以体会下为何un要被设置成单位矩阵
		}
		else
		{
			num >>= 1;
			in = Mul(in, in);

		}
	}
	B = Mul(in, un);
}


int main()
{
	
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d %d", &n, &k);
		for(int i=0; i<n; ++i)
			for(int j=0; j<n; ++j)
			{
				scanf("%d", &A.ma[i][j]);
				B.ma[i][j] = 0;
				unit.ma[i][j] = (i==j);
			}

			fun(k);
			int ans = 0;

			for(int i=0; i<n; ++i)
			{	for(int j=0;j<n-1;j++)
				{
					printf("%d ",B.ma[i][j]%MOD);
				}
			printf("%d\n",B.ma[i][n-1]%MOD);

			}
	}

	return 0;
}


你可能感兴趣的:(1397 计算矩阵幂)