其实矩阵快速幂类同与求快速幂,用二分法。
矩阵(方阵) A^n = A^(n/2) * A^(n/2) = A^(n/4) * A^(n/4) * A^(n/4) * A^(n/4) = ..... = A^(n/n)*...*A^(n/n);
关键代码
while(n)
{
if(n&1)
ans *= a;
n>>=1;
a*=a;
} ///这里都是矩阵乘法,ans为结果矩阵。
例题:请用矩阵快速幂方法,即利用以下公式求Fibonacci数列第n项。
代码
#include <stdio.h>
void multiply( int c[2][2], int a[2][2], int b[2][2] )
{
int temp[2][2];
for( int i = 0; i < 2; i++ )
{
for( int j = 0; j < 2; j++ )
{
temp[i][j] = 0;
for( int k = 0; k < 2; k++ )
temp[i][j] += a[i][k]*b[k][j];
}
}
for( int i = 0; i < 2; i++ )
for( int j = 0; j < 2; j++ )
c[i][j] = temp[i][j];
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ans[2][2] = {1,0,0,1},a[2][2] = {0,1,1,1};
while(n)
{
if(n&1)
{
multiply(ans,ans,a);
}
n>>=1;
multiply(a,a,a);
}
printf("%d\n",ans[0][1]);
}
return 0;
}