快速幂

Posted lhm-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂相关的知识,希望对你有一定的参考价值。

普通快速幂

(code :)

ll qp(ll x,ll y)
{
    ll ans=1;
    while(y)
    {
        if(y&1) ans*=x;
        x*=x;
        y>>=1;
    }
    return ans;
}

有时配合龟速乘使用

(code :)

ll mul(ll x,ll y)
{
    ll ans=0;
    while(y) 
    {
        if(y&1) ans+=x;
        x+=x;
        y>>=1;
    }
    return ans;
}

(O(1))快速乘

(code :)

ll mul(ll x,ll y,ll mod)
{
    return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;
}

矩阵快速幂

(code :)

struct matrix
{
    ll a[maxn][maxn];
    matrix()
    {
        memset(a,0,sizeof(a));//要赋初值,不然会出锅
    }
}m,e;
matrix operator *(const matrix &x,const matrix &y)//重载矩阵乘法
{
    matrix z;
    for(int k=1;k<=n;++k)
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                z.a[i][j]+=x.a[i][k]*y.a[k][j];
    return z;
}
matrix qp(matrix x,ll y)
{
    matrix ans=e;
    while(y)
    {
        if(y&1) ans=ans*x; 
        x=x*x;
        y>>=1;
    }
    return ans;
}

......

for(int i=1;i<=n;++i) e.a[i][i]=1;//构造单位矩阵

通常用来矩阵加速,已知递推式,求数列第(n)

(f[i]=f[i-3]+f[i-1] (i>3))

先构造目标矩阵(egin{bmatrix} f[i]\ f[i-1] \f[i-2]end{bmatrix} quad)

[f[i]=f[i-1]×1+f[i-2]×0+f[i-3]×1]

[f[i-1]=f[i-1]×1+f[i-2]×0+f[i-3]×0]

[f[i-2]=f[i-1]×0+f[i-2]×1+f[i-3]×0]

得到初始矩阵(egin{bmatrix} 1&0&1\1&0&0\0&1&0end{bmatrix} quad)

初始矩阵进行(n)次方后,第二行第一个元素即为(f[n])

以上是关于快速幂的主要内容,如果未能解决你的问题,请参考以下文章

矩阵快速幂

快速幂

快速幂

快速幂乘法&快速幂取余

快速幂和慢速乘

快速幂解法