Tr A hdu 1575数学问题

来源:互联网 发布:centos 编译安装lamp 编辑:程序博客网 时间:2024/04/29 17:19

Tr A

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

 

 

 

代码如下:

#include<stdio.h> 

#include<string.h>

int k,n;

#define yu 9973

 

typedef struct Matrix

{

       int a[12][12];

}matrix;

 

 

matrix p,q;

 

 

 

matrix compute(matrix A,matrix B)

{

       int i,j,l;

       matrix C;

                    

              for(i=1;i<=n;i++)

                     for(j=1;j<=n;j++)

                     {

                            C.a[i][j]=0;

                            for(l=1;l<=n;l++)

                                   C.a[i][j]+=(A.a[i][l]*B.a[l][j]);

                         C.a[i][j]%=yu;

                     }

    return C;

                    

}

 

 

 

void ss()

{

       int kk=k;

       int sum=0;

       matrix pp,qq;

       pp=p;qq=q;

       while(kk!=1)

       {

              if(kk&1)

              {

                     kk--;

                     pp=compute(pp,qq);

              }

              else

              {

                     kk>>=1;

                     qq=compute(qq,qq);

              }

       }

       pp=compute(pp,qq);

       for(int i=1;i<=n;i++)

          sum+=pp.a[i][i];

              sum%=yu;

       printf("%d/n",sum);

}

 

 

int main()

{

       int t;

           int i,j;

 

 

       scanf("%d",&t);

       while(t--)

       {

              scanf("%d%d",&n,&k);

              for(i=1;i<=n;i++)

                     for(j=1;j<=n;j++)

                     {

                            scanf("%d",&q.a[i][j]);

                                   p.a[i][j]=(i==j);

                     }

                     ss();

       }

       return 0;

}