hdu 1575 Tr A

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1575

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2566    Accepted Submission(s): 1906


Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
 

Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
 

Output
对应每组数据,输出Tr(A^k)%9973。
 

Sample Input
  
  
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
 

Sample Output
  
  
2 2686
 

Author
xhd
 

Source
 

Recommend
linle   |   We have carefully selected several similar problems for you:   1757  1588  2254  3117  2294 
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int iMod = 9973;
const int MAXN = 11;

struct MatrixNode
{
	int iMatrix[MAXN][MAXN];
};
MatrixNode iPer, iCell;

void Inite(int n)
{
	int i, j;
	for (i = 0; i < n; ++i)
	{
		for(j = 0; j < n; ++j)
		{
			scanf("%d", &iCell.iMatrix[i][j]);
			iPer.iMatrix[i][j] = (i==j);
		}
	}
}

MatrixNode Multi_Matrix(MatrixNode a, MatrixNode b, int n)
{
	MatrixNode c;
	int i, j, k;
	for (i = 0; i < n; ++i)
	{
		for (j = 0; j < n; ++j)
		{
			c.iMatrix[i][j] = 0;
			for (k = 0; k < n; ++k)
			{
				c.iMatrix[i][j] = (c.iMatrix[i][j] + a.iMatrix[i][k]*b.iMatrix[k][j])%iMod;
			}
		}
	}
	return c;
}

MatrixNode Quick_Mod_Matrix(int k, int n)
{
	MatrixNode c, iCur;
	c = iPer;
	iCur = iCell;
	while (k)
	{
		if(k&1)
		{
			c = Multi_Matrix(c, iCur, n);
			k--;
		}
		iCur = Multi_Matrix(iCur, iCur, n);
		k >>= 1;
	}
	return c;
}

int main()
{
	int T, n, k, i, iSum;
	scanf("%d", &T);
	MatrixNode iRes;
	while (T--)
	{
		scanf("%d %d", &n, &k);
		Inite(n);
		iRes = iCell;
		iRes = Quick_Mod_Matrix(k, n);
		iSum = 0;
		for (i = 0; i < n; ++i)
			iSum = (iSum + iRes.iMatrix[i][i])%iMod;
		printf("%d\n", iSum);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值