1397 计算矩阵幂

原创 2012年03月26日 10:04:56
描述

描述很简单:

计算[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;
}


相关文章推荐

hdu 1397 Goldbach's Conjecture

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1397 题目描述: Goldbach's Conjecture Time Limi...

Ural 1397. Points Game

Ural 1397. Points Game 假设玩家A取的石子集合是A,B的是B val = Sum( distant(pi,pj) ) { i      = Sum( distant...
  • utoppia
  • utoppia
  • 2013年08月23日 13:13
  • 682

1397

Goldbach's Conjecture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java...

hdu1397Goldbach's Conjecture(素数筛打表+二分)

Goldbach's Conjecture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O...
  • Sxx312
  • Sxx312
  • 2016年07月16日 19:36
  • 307

南邮 OJ 1397 Decoding

Decoding 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 38            测试通过...

NUC1397 Oil Deposits【DFS】

Oil Deposits 时间限制: 1000ms 内存限制: 65535KB 问题描述 The GeoSurvComp geologic survey company is responsible...

HDU - 1397 Goldbach's Conjecture(哥德巴赫猜想)

素数筛法

九度OJ 1396(DP) 1397(尺取法) 1398(最值) 1399(背包,DP) 1401(未完成)

1396:最少零的路径题意一个由非负整数构成的N * N大小的矩阵,你需要按照如下的规则找到一条访问路径: 1、起点为该矩阵的最左上角元素 2、终点为该矩阵的最右下角元素 ...

HDU 1397 Goldbach's Conjecture

素数计算

杭电1397--素数问题-哥德吧猜想

哥德巴赫猜想的 问题描述 任何偶数哥德巴赫猜想:n大于等于4,存在至少一对素数p1和p2,n = p1+p2。 这个猜想尚未证明也不拒绝。没人知道是否这个猜想成立。然而,人们可以发现这样一双质数,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1397 计算矩阵幂
举报原因:
原因补充:

(最多只允许输入30个字)