Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1994 Accepted Submission(s): 1472
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
Author
xhd
Source
为了学其他知识,先学习矩阵来打个基础。
这道题,不难,是个模板题。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 7 8 struct node 9 { 10 __int64 mat[12][12]; 11 }hxl,tom; 12 13 void make_first(node *cur,int n) 14 { 15 int i,j; 16 for(i=1;i<=n;i++) 17 for(j=1;j<=n;j++) 18 if(i==j) 19 cur->mat[i][j]=1; 20 else cur->mat[i][j]=0; 21 } 22 23 struct node cheng(node cur,node now,int n) 24 { 25 node ww; 26 int i,j,k; 27 memset(ww.mat,0,sizeof(ww.mat)); 28 for(i=1;i<=n;i++) 29 for(k=1;k<=n;k++) 30 if(cur.mat[i][k]) 31 { 32 for(j=1;j<=n;j++) 33 if(now.mat[k][j]) 34 { 35 ww.mat[i][j]+=cur.mat[i][k]*now.mat[k][j]; 36 if(ww.mat[i][j]>=9973) 37 ww.mat[i][j]%=9973; 38 } 39 } 40 return ww; 41 } 42 43 __int64 power_sum2(int n,int k) 44 { 45 int i; 46 __int64 sum=0; 47 make_first(&tom,n); 48 while(k) 49 { 50 if(k&1) 51 { 52 tom=cheng(tom,hxl,n); 53 } 54 k=k>>1; 55 hxl=cheng(hxl,hxl,n); 56 } 57 for(i=1;i<=n;i++) 58 sum=(sum+tom.mat[i][i])%9973; 59 return sum; 60 } 61 62 int main() 63 { 64 int T,n,k,i,j; 65 __int64 sum; 66 while(scanf("%d",&T)>0) 67 { 68 while(T--) 69 { 70 scanf("%d%d",&n,&k); 71 for(i=1;i<=n;i++) 72 for(j=1;j<=n;j++) 73 scanf("%I64d",&hxl.mat[i][j]); 74 sum=power_sum2(n,k); 75 printf("%I64d ",sum); 76 } 77 } 78 return 0; 79 }