矩阵快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度降到o(logn)。
若A是一个矩阵,那么求A的n次方的过程就是矩阵快速幂。
现在要求A^156,而156(10)=10011100(2)
也就有A^156=(A^4)*(A^8)*(A^16)*(A^128)
核心代码:
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
struct matrix{
int a[2][2];
}origin,res;
matrix multiply_matrix(matrix x,matrix y){
matrix z;
memset(z.a,0,sizeof(z.a));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
z.a[i][j]+=x.a[i][k]*y.a[k][j];
}
}
}
return z;
}
void init()
{
cout<<"随机矩阵如下:"<<endl;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
origin.a[i][j]=rand()%10;
cout<<origin.a[i][j]<<" ";
}
cout<<endl;
}
memset(res.a,0,sizeof(res.a));
res.a[0][0]=1;
res.a[1][1]=1;
}
void matrix_pow(int n){
while(n){
if(n&1){
res=multiply_matrix(res,origin);
}
n>>=1;
origin=multiply_matrix(origin,origin);
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
cout<<res.a[i][j]<<" ";
}
cout<<endl;
}
}
int main ()
{
int n;
while(cin>>n){
init();
matrix_pow(n);
}
}