hdu 1575 Tr A

Tr A

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
 
矩阵快速幂模板,求Ak后的主对角线和。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef vector<int> vec;
 4 typedef vector<vec> mat;
 5 const int mod = 9973;
 6 mat mul(mat &A, mat &B) {
 7     mat C(A.size(), vec(B[0].size()));
 8     for(int i = 0; i < A.size(); i ++) {
 9         for(int j = 0; j < B[0].size(); j ++) {
10             for(int k = 0; k < B.size(); k ++) {
11                 C[i][j] = (C[i][j] + A[i][k]*B[k][j])%mod;
12             }
13         }
14     }
15     return C;
16 }
17 
18 mat pow(mat A, int n) {
19     mat B(A.size(), vec(A.size()));
20     for(int i = 0; i < A.size(); i ++) B[i][i] = 1;
21     while(n) {
22         if(n&1) B = mul(B,A);
23         A = mul(A,A);
24         n >>= 1;
25     }
26     return B;
27 }
28 int main() {
29     int t, n, k;
30     cin >> t;
31     while(t--) {
32         cin >> n >> k;
33         mat A(n, vec(n));
34         for(int i = 0; i < n; i ++) {
35             for(int j = 0; j < n; j ++) {
36                 cin >> A[i][j];
37             }
38         }
39         mat B = pow(A, k);
40         int ans = 0;
41         for(int i = 0; i < n; i ++) {
42             ans = (ans+B[i][i])%mod;
43         }
44         cout << ans << endl;
45     }
46     return 0;
47 }

 

posted @ 2018-05-04 18:17  starry_sky  阅读(183)  评论(0编辑  收藏  举报