HDU-1575-Tr A(矩陣快速冪模板)
阿新 • • 發佈:2018-12-01
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++) 15for(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 }