HDU - 1575 Tr A

来源:互联网 发布:新媒体与网络传播 编辑:程序博客网 时间:2024/06/06 15:41

题目:

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

22 21 00 13 999999991 2 34 5 67 8 9

Sample Output

22686

直接把(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的num次方{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;}


2 0
原创粉丝点击