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 }