【算法笔记】矩阵加速

原文链接

第一篇:矩阵快速幂模板

1.矩阵乘法基础

给定矩阵 A A A( m × n m×n m×n)和 B B B( n × p n×p n×p),其乘积 C C C( m × p m×p m×p)定义为:
C [ i ] [ j ] = ∑ k = 1 n A [ i ] [ k ] ⋅ B [ k ] [ j ] C[i][j]=\sum_{k=1}^{n}A[i][k]·B[k][j] C[i][j]=k=1nA[i][k]B[k][j]

性质

  • 满足结合律: ( A B ) C = A ( B C ) (AB)C=A(BC) (AB)C=A(BC)
  • 不满足交换律: A B ≠ B A AB≠BA AB=BA

2.矩阵快速幂实现

Matrix matrix_pow(Matrix a, long long k) {
    Matrix res(n);
    res.build_identity();
    while(k>0){
        if(k&1) res=res*a;
        a=a*a;
        k>>=1;
    }
    return res;
}

第二篇:斐波那契数列加速

1.递推关系

[ F n F n − 1 ] = [ 1 1 1 0 ] ⋅ [ F n − 1 F n − 2 ] \begin{bmatrix}F_n\\F_{n-1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}·\begin{bmatrix}F_{n-1}\\F_{n-2}\end{bmatrix} [FnFn1]=[1110][Fn1Fn2]

展开得:
[ F n F n − 1 ] = [ 1 1 1 0 ] n − 2 ⋅ [ 1 1 ] \begin{bmatrix}F_n\\F_{n-1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-2}·\begin{bmatrix}1\\1\end{bmatrix} [FnFn1]=[1110]n2[11]

2.核心代码

struct Matrix {
    int a[2][2];
    void build_base() {
        a[0][0]=a[0][1]=a[1][0]=1;
        a[1][1]=0;
    }
};

Matrix operator*(const Matrix &a, const Matrix &b) {
    Matrix c;
    for(int k=0;k<2;k++)
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                c.a[i][j]=(c.a[i][j]+1LL*a.a[i][k]*b.a[k][j])%MOD;
    return c;
}

第三篇:斐波那契公约数

1.关键定理

gcd ⁡ ( F n , F m ) = F gcd ⁡ ( n , m ) \gcd(F_n,F_m)=F_{\gcd(n,m)} gcd(Fn,Fm)=Fgcd(n,m)

2.实现步骤

  1. 计算 d = gcd ⁡ ( n , m ) d=\gcd(n,m) d=gcd(n,m)
  2. F d F_d Fd
    [ F d F d − 1 ] = [ 1 1 1 0 ] d − 2 ⋅ [ 1 1 ] \begin{bmatrix}F_d\\F_{d-1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{d-2}·\begin{bmatrix}1\\1\end{bmatrix} [FdFd1]=[1110]d2[11]

3.代码实现

void solve() {
    long long n,m;
    cin>>n>>m;
    long long d=gcd(n,m);
    if(d<=2) cout<<1<<"\n";
    else {
        Matrix base;
        base.build_base();
        Matrix res=matrix_pow(base,d-2);
        cout<<(res.a[0][0]+res.a[0][1])%MOD<<"\n";
    }
}

复杂度分析

方法 时间复杂度
直接递推 O ( n ) O(n) O(n)
矩阵快速幂 O ( log ⁡ n ) O(\log n) O(logn)

应用场景

  1. 线性递推式加速
  2. 动态规划优化
  3. 图论中路径计数

你可能感兴趣的:(算法笔记,算法,笔记,矩阵)