码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 1575 Tr A(矩阵快速幂)

时间:2016-08-20 16:27:11      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

题目:

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

直接把(A^k)%9973求出来,然后求它的迹,最后取模即可。

很容易证明,Tr(A^k)%9973=Tr((A^k)%9973)%9973

代码:

#include<iostream>
using namespace std;

int n, k;
int in[10][10];
int list[10][10];
int temp[10][10];

void pro(int l1[][10], int l2[][10], int t[][10])		//t=l1*l2
{
	for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
	{
		t[i][j] = 0;
		for (int k = 0; k < n; k++)t[i][j] = (t[i][j] + l1[i][k] * l2[k][j]) % 9973;
	}
}

void f(int num)		//让list是in的n次方
{
	if (num == 0)
	{
		for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)list[i][j] = (i == j);
		return;
	}
	f(num / 2);
	pro(list, list, temp);
	if (num % 2)pro(temp, in, list);
	else for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)list[i][j] = temp[i][j];
}

int get_tr()
{
	int sum = 0;
	for (int i = 0; i < n; i++)sum += list[i][i];
	return sum;
}

int main()
{
	int cas;
	cin >> cas;
	while (cas--)
	{
		cin >> n >> k;
		for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)cin >> in[i][j];
		f(k);
		cout << get_tr() % 9973 << endl;
	}
	return 0;
}


HDU - 1575 Tr A(矩阵快速幂)

标签:

原文地址:http://blog.csdn.net/nameofcsdn/article/details/52259384

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!