1. 程式人生 > >HDU-1575-Tr A(矩陣快速冪模板)

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 }