快速幂与矩阵快速幂模板

快速幂模板

int qpow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1) ret*=a;
        b>>=1;
        a*=a;
    }
    return ret;
}

矩阵快速幂模板

建议开 long long

struct Matrix
{
    struct MatrixLine
    {
        int b[105];
        int& operator[](int x)
        {
            return b[x];
        }
    } a[105];
    MatrixLine& operator[](int x)
    {
        return a[x];
    }
    Matrix(){memset(a,0,sizeof a);}
    Matrix operator*(const Matrix &b)
    {
        Matrix ret;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++) ret[i][j]=(ret[i][j]+a[i].b[k]*b.a[k].b[j])%MOD;
        return ret;
    }
    Matrix& operator=(const Matrix &b)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                a[i].b[j]=b.a[i].b[j];
            }
        }
        return *this;
    }
} ans;

istream& operator>>(istream& in,Matrix &a)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            in>>a[i][j];
        }
    }
    return in;
}

ostream& operator<<(ostream& out,const Matrix &a)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            out<<a.a[i].b[j]<<" ";
        }
        out<<endl;
    }
    return out;
}

Matrix qpow(int k)
{
    Matrix ret;
    for(int i=1;i<=n;i++) ret[i][i]=1;
    while(k)
    {
        if(k&1) ret=ret*ans;
        ans=ans*ans;
        k>>=1;
    }
    return ret;
}
posted @ 2021-11-19 15:01  yhang323  阅读(16)  评论(0)    收藏  举报