hdu 1575 Tr A (二分矩阵)
Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2449 Accepted Submission(s): 1819
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的内容。
每组数据的第一行有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
Author
xhd
Source
Recommend
1 //0MS 212K 969 B G++ 2 /* 3 4 第一次 做矩阵的题.有点渣,不过这题是水题。 5 6 */ 7 #include<stdio.h> 8 #include<string.h> 9 #define N 9973 10 struct matrix{ 11 int g[15][15]; 12 }temp,ans; 13 int n; 14 matrix mutil(matrix a,matrix b) 15 { 16 matrix c; 17 for(int i=0;i<n;i++) 18 for(int j=0;j<n;j++){ 19 c.g[i][j]=0; 20 for(int k=0;k<n;k++){ 21 c.g[i][j]+=a.g[i][k]*b.g[k][j]; 22 c.g[i][j]%=N; 23 } 24 } 25 return c; 26 } 27 void solve(int k) 28 { 29 while(k){ 30 if(k&1) ans=mutil(temp,ans); 31 temp=mutil(temp,temp); 32 k/=2; 33 } 34 int sum=0; 35 for(int i=0;i<n;i++){ 36 sum+=ans.g[i][i]; 37 sum%=N; 38 } 39 printf("%d\n",sum); 40 } 41 int main(void) 42 { 43 int t,k; 44 scanf("%d",&t); 45 while(t--) 46 { 47 scanf("%d%d",&n,&k); 48 for(int i=0;i<n;i++) 49 for(int j=0;j<n;j++){ 50 ans.g[i][j]=(i==j); 51 scanf("%d",&temp.g[i][j]); 52 } 53 solve(k); 54 } 55 return 0; 56 }