hdu 1575 Tr A (矩阵快模幂)

来源:互联网 发布:linux 查看监听端口 编辑:程序博客网 时间:2024/06/05 10:28

Tr A

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

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
 

#include<iostream>
using namespace std;
const int MAX=101;

int n;

typedef struct Matrix
{
 int mat[MAX][MAX];
}matrix;

matrix A,B;

Matrix matrix_mul(matrix a,matrix b)
{
 matrix c;
 memset(c.mat,0,sizeof(c.mat));
 int i,j,k;
 for(i=1;i<=n;i++)  //矩阵乘法
  for(j=1;j<=n;j++)
   for(k=1;k<=n;k++)
   {
    c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
    c.mat[i][j]%=9973;
   }
 return c;
}

Matrix matrix_quick_power(matrix a,int k)
{
 int i;
 matrix b;
 memset(b.mat,0,sizeof(b.mat));
 for(i=1;i<=n;i++)
  b.mat[i][i]=1;
 while(k)
 {
  if(k&1)b=matrix_mul(a,b);  
  a=matrix_mul(a,a);
  k>>=1;
 }
 return b;
}

int main()
{
 int i,j,sum,k,t;
 cin>>t;
 while(t--)
 {
  cin>>n>>k;
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    cin>>A.mat[i][j];
  B=matrix_quick_power(A,k);
  sum=0;
  for(i=1;i<=n;i++)
  {
   sum+=B.mat[i][i];
   sum%=9973;
  }
  cout<<sum<<endl;
 }
 return 0;
}