HDU-1575-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


思路:矩阵快速幂裸题。


 1 #include<iostream>
 2 #include<cstring>
 3 #define mod 9973
 4 using namespace std;
 5 int n;
 6 
 7 struct mat{
 8     int a[15][15];
 9 };
10 
11 mat mult(mat x,mat y){
12     mat ans;
13     memset(ans.a,0,sizeof(ans.a));
14     for(int i=0;i<n;i++)
15     for(int j=0;j<n;j++)
16     for(int k=0;k<n;k++){
17         ans.a[i][j]+=x.a[i][k]*y.a[k][j]; 
18         ans.a[i][j]%=mod;
19     }
20     
21     return ans;
22 }
23 
24 mat qm(mat a,long long b){
25     mat I;
26     memset(I.a,0,sizeof(I.a));
27     for(int i=0;i<n;i++)
28         I.a[i][i]=1;
29     while(b){
30         if(b&1) I=mult(I,a);
31         b=b>>1;
32         a=mult(a,a);
33     }
34     return I;
35 }
36 
37 int main(){
38     int T,k;
39     mat A;
40     cin>>T;
41     while(T--){
42         cin>>n>>k;
43         for(int i=0;i<n;i++)
44         for(int j=0;j<n;j++)
45             cin>>A.a[i][j];
46     
47         A=qm(A,k);
48         int ans=0;    
49         for(int i=0;i<n;i++)
50               ans+=A.a[i][i];
51         cout<<ans%mod<<endl;               
52     }    
53     return 0;
54 } 

猜你喜欢

转载自www.cnblogs.com/yzhhh/p/10048953.html