快速幂和矩阵快速幂

快速幂

快速幂主要运用了分治的思想
具体推理过程可以看洛谷的题解思路 https://www.luogu.com.cn/problem/solution/P1226
代码模板如下

int quickPower(int a, int b)//是求a的b次方
{
    int ans = 1, base = a;//ans为答案,base为a^(2^n)
    while(b > 0)//b是一个变化的二进制数,如果还没有用完
    {
        if(b & 1)//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是:
            ans *= base;//把ans乘上对应的a^(2^n)

        base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
        b >>= 1;
    }
    return ans;
}

以及快速幂模

int pow_mod(int a,int b,int c){//求a的b次方模c的结果
    int ans = 1;
    int base = a%c;
    while(b){
        if(b & 1) ans = (ans*base)%c;
        base = (base*base)%c;
        b >>= 1;
    }
    return ans;
}

矩阵快速幂

而掌握了快速幂的代码 实现矩阵快速幂也十分简单 只需要用一个结构体实现矩阵的逻辑 并重载乘法符号 套用上面的模板就好

结构体实现矩阵

struct ahaha{
    ll a[maxn][maxn];     //一般用long long 数据
    ahaha(){
        memset(a,0,sizeof a);
    }
    inline void build(){     //构建单位矩阵
        for(int i=1;i<=n;++i)a[i][i]=1;
    }
}a;

运算符重载

ahaha operator *(const ahaha &x,const ahaha &y){     
    ahaha 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]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;
    return z;
}

然后就可以套用快速幂公式来实现矩阵快速幂(ans,base需要是结构体定义的矩阵)
例题
洛谷P3390
洛谷P1939

posted @ 2020-08-18 14:44  一个经常掉线的人  阅读(117)  评论(0编辑  收藏  举报