poj 3233 Matrix Power Series

                                                                   Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 3112 Accepted: 1163

Description

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

Input

The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

2 2 4

0 1

1 1

Sample Output

1 2

2 3

Source

POJ Monthly--2007.06.03, Huang, Jinsong

[Submit]   [Go Back]   [Status]   [Discuss]

 

// 5138440 11410 3233 Wrong Answer   C++ 1597B 2009-05-12 11:28:50 
// 5138462 11410 3233 Accepted 876K 125MS C++ 1718B 2009-05-12 11:34:08 
// Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
#include  < iostream >
#define  MAX 33
using   namespace  std;
typedef 
struct  node
{
    
int  matirx[MAX][MAX];
}Matrix;
Matrix a,sa,unit;
int  n,k,m;
void  Init()
{
    
int  i,j;
    
for (i = 0 ;i < n;i ++ )
        
for (j = 0 ;j < n;j ++ )
        {
            scanf(
" %d " , & a.matirx[i][j]);
            a.matirx[i][j]
%= m;    // 初始化要先%m
            unit.matirx[i][j] = (i == j);   // 如果i==j那么矩阵中此值就是1,否则为0,就是主对角线是1的单位矩阵
        }
}
Matrix Add(Matrix a,Matrix b)  
// 矩阵加法
{
    Matrix c;
    
int  i,j;
    
for (i = 0 ;i < n;i ++ )
        
for (j = 0 ;j < n;j ++ )
        {
            c.matirx[i][j]
= a.matirx[i][j] + b.matirx[i][j];
            c.matirx[i][j]
%= m;    // 加的时候也要%m
        }
    
return  c;
}
Matrix Mul(Matrix a,Matrix b)  
// 矩阵乘法
{
    Matrix c;
    
int  i,j,k;
    
for (i = 0 ;i < n;i ++ )
        
for (j = 0 ;j < n;j ++ )
        {
            c.matirx[i][j]
= 0 ;   // 初始化矩阵c
             for (k = 0 ;k < n;k ++ )
                c.matirx[i][j]
+= a.matirx[i][k] * b.matirx[k][j];
            c.matirx[i][j]
%= m;   // 计算乘法的时候也要%m
        }
    
return  c;
}
Matrix Cal(
int  exp)    // 矩阵幂
{
    Matrix p,q;
    p
= a;   // p是初始矩阵
    q = unit;   // q是单位矩阵
     while (exp != 1 )
    {
        
if (exp & 1 )   // 要求得幂是奇数
        {
            exp
-- ;
            q
= Mul(p,q);
        } 
        
else      // 要求的幂是偶数
        {
            exp
>>= 1 ;   // 相当于除2
            p = Mul(p,p);
        }
    }
    p
= Mul(p,q);
    
return  p;
}
Matrix MatrixSum(
int  k)
{
    
if (k == 1 )   // 做到最底层就将矩阵a返回就好
         return  a;
    Matrix temp,tnow;
    temp
= MatrixSum(k / 2 );
    
if (k & 1 )   // 如果k是奇数
    {
        tnow
= Cal(k / 2 + 1 );
        temp
= Add(temp,Mul(temp,tnow));
        temp
= Add(tnow,temp);
    }  
    
else      // 如果k是偶数
    {
        tnow
= Cal(k / 2 );
        temp
= Add(temp,Mul(temp,tnow));
    }
    
return  temp;
}
int  main()
{
    
int  i,j;
    
while (scanf( " %d%d%d " , & n, & k, & m) != EOF)
    {
        Init();
        sa
= MatrixSum(k);
        
for (i = 0 ;i < n;i ++ )
        {
            
for (j = 0 ;j < n - 1 ;j ++ )
            {
                printf(
" %d  " ,sa.matirx[i][j] % m);
            }
            printf(
" %d\n " ,sa.matirx[i][n - 1 ] % m);
        }
    }
    
return   0 ;
}

你可能感兴趣的:(Matrix)