首页 > 代码库 > HDU - 1575 Tr A

HDU - 1575 Tr A

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;
}