矩阵快速幂

简介

矩阵快速幂是一种高效计算矩阵幂的方法。它利用了矩阵的幂运算具有分治性质的特点,可以将矩阵的幂运算时间复杂度从 O(n)降低到 O(logn)。可用于解决线性递推式问题。


经典的斐波那契数列fn=fn-1+fn-2。当n很大时,你无法快速的计算第n项的值。可以构造矩阵

F_{n}=\begin{pmatrix} f_{n} &f_{n+1} \end{pmatrix} ,F_{n+1}=\begin{pmatrix} f_{n+1} &f_{n+2} \end{pmatrix}   A=\begin{pmatrix} 0 & 1\\ 1& 1 \end{pmatrix}

\begin{pmatrix} f_{n} & f_{n+1} \end{pmatrix} *\begin{pmatrix} 0 &1 \\ 1& 1 \end{pmatrix}=\begin{pmatrix} f_{n+1} & f_{n+2} \end{pmatrix}

F_{n+1}=F_{n}*A F_{n}=F_{1}*A^{n-1}

通过矩阵快速幂得到Fn矩阵 a(0,0) 即为 fn 

Code

struct matrix 
{
    ll mat[2][2];
    void init() {
        memset(mat,0,sizeof mat);
    }
};
matrix mul(matrix a,matrix b)
{
    matrix c;
    c.init();
    for(int i=0;i<2;i++) {
        for(int j=0;j<2;j++) {
            for(int k=0;k<2;k++) {
                c.mat[i][j]+=(a.mat[i][k]%mod)*(b.mat[k][j]%mod)%mod;
                c.mat[i][j]%=mod;
            }
        }
    }
    return c;     
}
matrix ksm(matrix a,ll n)
{
    matrix b;
    b.init();
    for(int i=0;i<2;i++) b.mat[i][i]=1;   //单位矩阵
    while(n)
    {
        if(n&1) b=mul(b,a);
        a=mul(a,a);
        n>>=1;
    }
    return b;
}

对于更加复杂的递推式,应灵活构造矩阵来解决

题目

1.求斐波那契数列前n项和

有如下递推式 Fn=Fn-1+Fn-2  Sn=Sn-1+Fn 

构造矩阵

F_{n}=\begin{pmatrix} f_{n} &f_{n+1} &S_{n} \end{pmatrix} F_{n+1}=\begin{pmatrix} f_{n+1} &f_{n+2} &S_{n+1} \end{pmatrix}

A=\begin{pmatrix} 0& 1 & 0\\ 1& 1& 1\\ 0 & 0& 1 \end{pmatrix}

F_{n+1}=F_{n}*A

2.佳佳的斐波那契

链接:https://www.acwing.com/problem/content/1306/

  

 F_{n}=\begin{pmatrix} f_{n} &f_{n+1} & S_{n+1} &G_{n} \end{pmatrix} F_{n+1}=\begin{pmatrix} f_{n+1} &f_{n+2} &S_{n+2} &G_{n+1} \end{pmatrix}

A=\begin{pmatrix} 0 & 1& 0 & 0\\ 1& 1& 1& 0\\ 0& 0& 1& 1\\ 0& 0& 0& 1 \end{pmatrix}

F_{n+1}=F_{n}*A

附上之前写过的一道矩阵快速幂的题,其实看见题目范围大概就能猜出做法了

强(矩阵快速幂)_Cambrain_的博客-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值