ACM数论模板(更新ing...)

  • 快速幂
  • 矩阵快速幂

1、快速幂

描述:快速计算底数base的exp次幂,其时间复杂度为 O(log₂N)。

// 快速幂取模
ll quickMod(ll base,ll exp,ll mod){
    ll ans=1;
    while(exp){
        if(exp&1)ans=ans*base%mod;
        exp>>=1;
        base=base*base%mod;
    }
    return ans;
}

2、矩阵快速幂

描述: n*n矩阵的exp次幂。

// 矩阵快速幂取模
ll n;  //n*n矩阵
struct Mat{
    ll m[Max_n][Max_n];
    Mat(){memset(m,0,sizeof(m));}
    Mat operator*(Mat &a){
        Mat b;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++)
                for(int k=0;k<n;k++)
                b.m[i][j]=(b.m[i][j]+m[i][k]*a.m[k][j])%mod;
        }
        return b;
    }
};

Mat quickMod(Mat base,ll exp){
    Mat ans;
    for(int i=0;i<n;i++)ans.m[i][i]=1; //单位矩阵初始化
    while(exp){
        if(exp&1)ans=ans*base;
        exp>>=1;
        base=base*base;
    }
    return ans;
}

应用: 主要通过把数放到矩阵的不同位置,然后把普通递推式变成”矩阵的等比数列”,最后快速幂求解递推式。

  • 给一些简单的递推式:

    1.f(n)=a*f(n-1)+b*f(n-2)+c;(a,b,c是常数)
    这里写图片描述
    2.f(n)=c^n-f(n-1) ;(c是常数)
    这里写图片描述
    3.f(n)=f(n-1)+(-1)^n*f(n-2);
    =>f(n)=f(n-2)+f(n-4);

    4.f(n)=f(n-1)+f(n-2)+n^3+n^2+n+1;
    傻子

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/80108561