HDU 1575 Tr A (矩阵乘法)

来源:互联网 发布:文章类网站源码 编辑:程序博客网 时间:2024/05/29 19:22

Tr A

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


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 
 
矩阵乘法+快速幂
#include<stdio.h>#include<string.h>#include<algorithm>#define mod 9973using namespace std;struct node{int ma[110][110];};int n,k;node MUL(node a,node b){node c;int i,j,k;for(i=1;i<=n;i++){for(j=1;j<=n;j++){c.ma[i][j]=0;for(k=1;k<=n;k++){c.ma[i][j]=(c.ma[i][j]+(a.ma[i][k]*b.ma[k][j])%mod)%mod;}}}return c;}node Pow(node a,int x){node res=a;while(x){if(x&1){res=MUL(res,a);}a=MUL(a,a);x=x/2;}return res;}int main(){int i,j,ans,t;node f,p;scanf("%d",&t);while(t--){    scanf("%d%d",&n,&k);for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&f.ma[i][j]);}}p=Pow(f,k-1);ans=0;for(i=1;i<=n;i++){ans=(ans+p.ma[i][i]%mod);}printf("%d\n",ans%mod);}return 0;}


0 0
原创粉丝点击