快速幂/矩阵快速幂

快速幂:

int pow_mod(int a,int b,int c)
{
    a=a%c;
    int ans=1;
    while(b)
    {
        if(b&1)
            ans=ans*a%c;
        a=a*a%c;
        b>>=1;
    }
    return ans;
}

快速乘法:

ll q_mul(ll a,ll b)//计算a*b%mod的值
{
    ll ans=0;
    while(b)
    {
        if(b&1)
        {
            ans=(ans+a)%mod;
        }
        a=(a+a)%mod;
        b>>=1;
    }
    return ans;
}

矩阵快速幂模板:

const int N=2;
struct Matrix
{
    int a[N][N];
    Matrix()
    {
        mem(a,0);
    }
    void init()
    {
        mem(a,0);
        for(int i=0; i<N; i++)
            a[i][i]=1;
    }
};
void print(Matrix a)
{
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
            printf("%d ",a.a[i][j]);
        puts("");
    }
}
Matrix mul(Matrix a,Matrix b)
{
    Matrix ans;
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            for(int k=0; k<N; k++)
            {
                ans.a[i][j]+=a.a[i][k]*b.a[k][j];
                ans.a[i][j]%=mod;
            }
    return ans;
}
Matrix mat_pow(Matrix a,int n)
{
    Matrix ans;
    ans.init();
    while(n)
    {
        if(n&1)
            ans=mul(ans,a);
        a=mul(a,a);
        n>>=1;
    }
    return ans;
}

对于稀疏矩阵:

还有一个对于稀疏矩阵的加速办法……一般矩阵乘法这么写的:
for(int i=0; i<N; i++)
    for(int j=0; j<N; j++)
        for(int k=0; k<N; k++)
            a[i][j]+=b[i][k]*c[k][j];
改成
for(int i=0; i<N; i++)
    for(int j=0; j<N; j++)
        if(b[i][j])
            for(int k=0; k<N; k++)
                a[i][k]+=b[i][j]*c[j][k];

results matching ""

    No results matching ""