矩阵快速幂

1.矩阵的乘法。

 

  int a[10][20],b[20][30];
    int c[10][30];
    int i,j,k;
    memset(c,0,sizeof(c));
    for(i=0;i<10;i++)
    {
        for(j=0;j<30;j++)
        {
            for(k=0;k<20;k++) 
                c[i][j]+=a[i][k]*b[k][j];
        }
    }

2.利用矩阵快速幂求解斐波那契数列

当求斐波那契数列1e10的项的时候非常容易超时利用矩阵求斐波那契数列

 

斐波那契数列递推式为F(n)=F(n-1)+F(n-2) (n>=2) 

F(0)=0,F(1)=1                                                                                        根据递推式我们可以列出两个方程:F(n)=F(n-1)+F(n-2)和F(n-1)=F(n-2)+F(n-3)

 

由此

3.快速幂模板

#include
#include
#define LL long long
#define M 10
#define MOD 1000000007
struct Matrix{
    LL matrix[M][M];
};
int n;//矩阵的阶数 
void init(Matrix &res){
    for(int i=0;i<=n;i++)//单位矩阵
    {
        for(int j=0;j<=n;j++)
            res.matrix[i][j]=0;
        res.matrix[i][i]=1;
    }
}
Matrix multiplicative(Matrix a,Matrix b){
    Matrix res;
    memset(res.matrix,0,sizeof(res.matrix));
    for(int i = 0 ; i < n ; i++)
        for(int j = 0 ; j < n ; j++)
            for(int k = 0 ; k < n ; k++)
                res.matrix[i][j] =(res.matrix[i][j]%MOD+a.matrix[i][k]%MOD*b.matrix[k][j]%MOD)%MOD;
return res;
}
Matrix pow(Matrix mx,int m){
    Matrix res,base=mx;
    init(res); //初始为单位矩阵,即除主对角线都是1外,其他都是0
    while(m)
    {
        if(m&1)
            res=multiplicative(res,base);
        base=multiplicative(base,base);
        m>>=1;
    }
return res;
}
int main(){
    int m;
    n=2;
    scanf("%d",&m);
    Matrix base,res;
    base.matrix[0][0]=base.matrix[0][1]=base.matrix[1][0]=1;
    base.matrix[1][1]=0;
    res=pow(base,m-1);
    if(m==0)
        puts("0");
    else if(m==1)
        puts("1");
    else
        printf("%lld\n",res.matrix[0][0]%MOD);
    return 0;    
} 

 

 

 

 

 

 

你可能感兴趣的:(矩阵快速幂)