HDU 1575 Tr A(矩阵快速幂)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5537 Accepted Submission(s):
4161
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,其余为0
然后跑一下矩阵快速幂就好
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int MAXN=101; 5 inline void read(int &n){char c='+';bool flag=0;n=0; 6 while(c<'0'||c>'9') c=='-'?flag=1,c=getchar():c=getchar(); 7 while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();flag==1?n=-n:n=n;} 8 struct matrix 9 { 10 int m[11][11];matrix(){memset(m,0,sizeof(m));} 11 }; 12 matrix ma; 13 int limit; 14 const int mod=9973; 15 matrix mul(matrix a,matrix b) 16 { 17 matrix c; 18 for(int k=0;k<limit;k++) 19 for(int i=0;i<limit;i++) 20 for(int j=0;j<limit;j++) 21 c.m[i][j]=(c.m[i][j]+(a.m[i][k]*b.m[k][j]))%mod; 22 return c; 23 } 24 matrix fast_martix_pow(matrix ma,int p) 25 { 26 matrix bg; 27 for(int i=0;i<limit;i++) 28 for(int j=0;j<limit;j++) 29 bg.m[i][j]=(i==j); 30 while(p) 31 { 32 if(p&1) bg=mul(bg,ma); 33 ma=mul(ma,ma); 34 p>>=1; 35 } 36 return bg; 37 } 38 int main() 39 { 40 int T;read(T); 41 while(T--) 42 { 43 read(limit);int n;read(n); 44 for(int i=0;i<limit;i++) 45 for(int j=0;j<limit;j++) 46 read(ma.m[i][j]); 47 matrix ans=fast_martix_pow(ma,n); 48 int out=0; 49 for(int i=0;i<limit;i++) 50 out+=ans.m[i][i]%mod; 51 printf("%d\n",out%mod); 52 } 53 return 0; 54 }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。