HDU 1575 Tr A

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Total Submission(s): 93    Accepted Submission(s): 78


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
 

Author
xhd
 

Source
 

Recommend
linle
 

 
Statistic |  Submit |  Back

// 1354591 2009-05-10 10:11:59 Accepted 1575 0MS 268K 1362 B C++ Wpl 
#include  < iostream >
#define  MAX 11
using   namespace  std;
typedef 
struct  node
{
    
int  matrix[MAX][MAX];
//     int nn,mm;     // m代表行,n代表列
}Matrix;
Matrix init,unit;  
// 分别定义init为初始的输入矩阵,unit为单位矩阵
int  n,kk;
void  Init()
{
    
int  i,j;
    scanf(
" %d%d " , & n, & kk);
    
for (i = 0 ;i < n;i ++ )
        
for (j = 0 ;j < n;j ++ )
        {
            scanf(
" %d " , & init.matrix[i][j]);   // 输入初始矩阵
            unit.matrix[i][j] = (i == j);   // 初始化初始矩阵
        }
}
Matrix Mul(Matrix a,Matrix b)
// 据说传结构体比传数组快
{
    
int  i,j,k;
    Matrix c;
    
for (i = 0 ;i < n;i ++ )
        
for (j = 0 ;j < n;j ++ )
        {
            c.matrix[i][j] 
=   0 ;
            
for (k = 0 ;k < n;k ++ )
                c.matrix[i][j] 
+=  a.matrix[i][k] * b.matrix[k][j];
            c.matrix[i][j]
%= 9973 ;
        }
    
return  c;
}
Matrix Cal(
int  k) // k代表幂,这里是利用二分法求矩阵的幂
{
    Matrix p,q;
    p 
=  unit;    // p为单位矩阵
    q  =  init;    // q为初始矩阵
     while (k != 1 )
    {
        
if (k & 1 )   // k是奇数
        {
            k
-- ;
            p 
=  Mul(p,q);   // 如果k是奇数,那么就不能进行平均的二分,所以让p乘以一个单位矩阵,保证其不变,然后k--就可以进行二分了
        }
        
else    // k是偶数
        {
            k
>>= 1 ;   // k除2
            q  =  Mul(q,q);
        }
    }
    p 
=  Mul(p,q);
    
return  p;
}
int  main()
{
    Matrix r;
    
int  t;
    cin
>> t;
    
while (t -- )
    {
        Init();
        r
= Cal(kk);
        
int  i,j,sum;
        i
= 0 ;
        sum
= 0 ;
        
while (i < n)
        {
            sum
+= r.matrix[i][i];
            sum
%= 9973 ;
            i
++ ;
        }
        printf(
" %d\n " ,sum);
    }
    
return   0 ;
}

你可能感兴趣的:(HDU)