hdu 1575 Tr A(矩阵乘法)

来源:互联网 发布:c 数组赋值 编辑:程序博客网 时间:2024/05/16 00:51

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4187    Accepted Submission(s): 3128


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
22 21 00 13 999999991 2 34 5 67 8 9
 

Sample Output
22686
 

Author
xhd
 

Source
HDU 2007-1 Programming Contest
 

Recommend
linle   |   We have carefully selected several similar problems for you:  1757 1588 2256 2604 2254 
 

Statistic | Submit | Discuss | Note

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define p 9973using namespace std;struct data{  inta[20][20];}a,c;int n,m,t;void clear(data &a){for (int i=1;i<=n;i++) for (int j=1;j<=n;j++)  a.a[i][j]=0;}void change(data &a,data b){for (int i=1;i<=n;i++) for (int j=1;j<=n;j++)  a.a[i][j]=b.a[i][j];}data mul(data a,data b){data c; clear(c);for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { for (int k=1;k<=n;k++)  c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%p)%p; }return c;}data pow(data num,int x){data ans; clear(ans);for (int i=1;i<=n;i++) ans.a[i][i]=1;    data base; change(base,num); while (x){if (x&1)  ans=mul(ans,base);x>>=1;base=mul(base,base);}return ans;}int main(){freopen("a.in","r",stdin);scanf("%d",&t);for (int T=1;T<=t;T++){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) for (int j=1;j<=n;j++)  scanf("%d",&a.a[i][j]);data ans;  ans=pow(a,m);int sum=0;for (int i=1;i<=n;i++) sum=(sum+ans.a[i][i])%p;printf("%d\n",sum%p);}}



0 0
原创粉丝点击