快速幂和矩阵快速幂

求解a的b次方

快速幂的迭代写法

typedef long long LL;
LL binarypow(LL a,LL b,LL m) {
    LL ans=1;
    while(b>0){
        if(b&1){
            ans=ans*a%m;
        }
        a=a*a%m;
        b>>=1;
    }
    return ans;
}

快速幂的递归写法

typedef long long LL;
LL binarypow(LL a,LL b,LL m){
    if(b==0) return 1;
    if(b%2==1) return a*binarypow(a,b-1,m)%m;
    else {
        LL mul=binarypow(a,b/2,m);
        return mul*mul%m;
    }
}

矩阵快速幂(假设为一个4*4的矩阵)

#define LL long long 
const int mod=1000000007; 
struct matrix
{
    LL x[4][4];
};
matrix mutimatrix(matrix a,matrix b)//该函数用于算两个矩阵相乘
{
    matrix temp; 
    memset(temp.x,0,sizeof(temp.x));    
    for(int i=0;i<4;i++)
    for(int j=0;j<4;j++)
    for(int k=0;k<4;k++)
    {
        temp.x[i][j]+=a.x[i][k]*b.x[k][j];
        temp.x[i][j]%=mod;
    }
    return temp;
}

matrix k_powmatrix(matrix a,LL n)//矩阵快速幂,和之前的快速幂迭代写法差不多。
{
    matrix temp;
    memset(temp.x,0,sizeof(temp.x));
    for(int i=0;i<4;i++)
    temp.x[i][i]=1;

    while(n)
    {
        if(n&1)
        temp=mutimatrix(temp,a);
        a=mutimatrix(a,a);
        n>>=1;
    }
    return temp;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值