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

HDU - 1575 Tr A

时间:2014-07-02 09:14:24      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   数据   2014   os   

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

思路:就是一道矩阵乘法快速幂

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MOD = 9973;

struct Matrix {
	int arr[12][12];
}init, unit;
int n,k;

Matrix Mul(Matrix a, Matrix b) {
	Matrix c;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			c.arr[i][j] = 0;
			for (int k = 0; k < n; k++)
				c.arr[i][j] = (c.arr[i][j]+(a.arr[i][k]*b.arr[k][j])%MOD)%MOD;
		}
	return c;
}

Matrix Pow(Matrix a, Matrix b, int x) {
	while (x) {
		if (x & 1)
			b = Mul(b, a);
		x >>= 1;
		a = Mul(a, a);
	}
	return b;
}

int main() {
	int t;
	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", &init.arr[i][j]);
				unit.arr[i][j] = init.arr[i][j];
			}
		Matrix res = Pow(init, unit, k-1);
		int ans = 0;
		for (int i = 0; i < n; i++) 
			ans = (ans + res.arr[i][i]) % MOD;
		printf("%d\n", ans%MOD);
	}
	return 0;
}



HDU - 1575 Tr A,布布扣,bubuko.com

HDU - 1575 Tr A

标签:des   style   blog   数据   2014   os   

原文地址:http://blog.csdn.net/u011345136/article/details/36187929

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