(矩阵)快速幂

快速乘法:

ll qmul(ll x,ll y)
{
    ll res=0;
    for(;y;y>>=1,x<<=1)
        if(y&1)res+=x;
    return res;
}

快速幂:

ll qpow(ll x,ll y)
{
    ll res=1;
    for(;y;y>>=1,x=x*x)
        if(y&1)res=res*x;
    return res;
}

矩阵快速幂:

struct matrix
{
    int n,m;
    ll ma[105][105];
    matrix(int x,int y):n(x),m(y) {clear();}
    void set(int _n,int _m){n=_n,m=_m;}
    ll* operator[](int x){return ma[x];}
    matrix operator*(matrix x)
    {
        assert(m==x.n);
        matrix res(n,x.m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=x.m;j++)
                for(int k=1;k<=m;k++)
                    (res[i][j]+=ma[i][k]*x[k][j]%mod+mod)%=mod;
        return res;
    }
    matrix operator^(ll y)
    {
        assert(n==m);
        matrix x(n,m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                x[i][j]=ma[i][j];
        matrix res(x.n,x.n);
        for(int i=1;i<=x.n;i++)
            res[i][i]=1;
        for(;y;y>>=1,x=x*x)
            if(y&1)res=res*x;
        return res;
    }
    void print()
    {
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                printf("%lld%c",ma[i][j]," \n"[j==m]);
    }
    void clear() {memset(ma,0,sizeof(ma));}
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 题目链接POJ307 题意:求第n位斐波那契数mod 10000的大小。其中n的大小高达1000000000 由于...
    徐森威阅读 12,905评论 4 8
  • 上一篇文章讲解了下基于斐波那契数列的矩阵快速幂,即F(n) = F(n-1) + F(n-2),转移矩阵比较简单。...
    徐森威阅读 6,558评论 2 6
  • 快速幂:复杂度为logn,比普通的n快了很多了. 原理 : 实现代码如下:(位运算,简单,简洁) 矩阵快速幂: 所...
    Anxdada阅读 679评论 0 2
  • 垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,at...
    徐森威阅读 1,824评论 2 1
  • 1. 前些日子,父母打电话,询问我买票的事,他们知道春节票难抢,也默默为我担心,怕我买晚了,而抢不上票。当我告诉他...
    陈汐年阅读 9,088评论 85 80

友情链接更多精彩内容