题目链接:杭电1005.一个简单的矩阵快速幂,一开始一直不理解,只是会单纯数字的快速幂,后来经人点拨,只是运算单位不同,一个是矩阵一个是数字。普通数字中的快速幂是用1来作为累乘量的,而矩阵中的单位矩阵相当于这个1.所以,很自然的,把数字快速幂中的模板代码进行修改即可。要知道的是,快速幂是为了减少相乘的次数,从而提高运算效率。。
C语言:
高亮代码由发芽网提供
#include<iostream>
using namespace std;
int n , k;
typedef struct matrix {
int ma [ 15 ][ 15 ];
} jz;
jz A;
jz B;
jz danwei , un;
const int MOD = 9973;
jz cheng( jz m1 , jz m2)
{
jz c;
int i , j , k;
for( i = 0; i <n; i ++)
{
for( j = 0; j <n; j ++)
{
c . ma [ i ][ j ] = 0;
for( k = 0; k <n; k ++)
{
c . ma [ i ][ j ] += m1 . ma [ i ][ k ] * m2 . ma [ k ][ j ];
}
c . ma [ i ][ j ] %= MOD;
}
}
return c;
}
//矩阵快速幂//
void quick( int k)
{
jz temp = A;
jz un = danwei;
while( k)
{
if( k % 2 == 1)
un = cheng( temp , un);
temp = cheng( temp , temp);
k = k / 2;
}
B = un;
}
int main()
{
int T;
int i , j;
int sum = 0;
while( scanf( "%d" , & T) != EOF)
{
while( T --)
{
sum = 0;
scanf( "%d%d" , &n , & k);
for( i = 0; i <n; i ++)
for( j = 0; j <n; j ++)
{
scanf( "%d" , & A . ma [ i ][ j ]);
B . ma [ i ][ j ] = 0;
danwei . ma [ i ][ j ] =( i == j);
}
quick( k);
for( i = 0; i <n; i ++)
{
sum = sum +B . ma [ i ][ i ];
}
printf( "%d \n " , sum % MOD);
}
}
return 0;
}
using namespace std;
int n , k;
typedef struct matrix {
int ma [ 15 ][ 15 ];
} jz;
jz A;
jz B;
jz danwei , un;
const int MOD = 9973;
jz cheng( jz m1 , jz m2)
{
jz c;
int i , j , k;
for( i = 0; i <n; i ++)
{
for( j = 0; j <n; j ++)
{
c . ma [ i ][ j ] = 0;
for( k = 0; k <n; k ++)
{
c . ma [ i ][ j ] += m1 . ma [ i ][ k ] * m2 . ma [ k ][ j ];
}
c . ma [ i ][ j ] %= MOD;
}
}
return c;
}
//矩阵快速幂//
void quick( int k)
{
jz temp = A;
jz un = danwei;
while( k)
{
if( k % 2 == 1)
un = cheng( temp , un);
temp = cheng( temp , temp);
k = k / 2;
}
B = un;
}
int main()
{
int T;
int i , j;
int sum = 0;
while( scanf( "%d" , & T) != EOF)
{
while( T --)
{
sum = 0;
scanf( "%d%d" , &n , & k);
for( i = 0; i <n; i ++)
for( j = 0; j <n; j ++)
{
scanf( "%d" , & A . ma [ i ][ j ]);
B . ma [ i ][ j ] = 0;
danwei . ma [ i ][ j ] =( i == j);
}
quick( k);
for( i = 0; i <n; i ++)
{
sum = sum +B . ma [ i ][ i ];
}
printf( "%d \n " , sum % MOD);
}
}
return 0;
}