快速幂

二进制快速幂
一般这个就够了

int mpow(int a,int b){
   int rt=1;
   for(rt;b;a*=a,b>>=1){
      if(b&1) rt*=a;
   }
   return rt;
 }

【这段代码打起来真是得心应手啊】
十进制快速幂
有一次考试考到了,就去了解了这个东西

#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;

char str[100005];

int const mod = 1e9+8;

ll power(ll a,ll b){
    ll ans=1;
    for(ans;b;b>>=1,a=a*a%mod){
        if(b&1){
            ans=ans*a%mod;
//          b--;
        }
    }
    return ans; 
}

ll mpow(int a){
    int len=strlen(str);
    ll ans=1;
    while(len!=0){
        int k=str[len-1]-'0';
        ans=ans*power(a,k)%mod;
        a=power(a,10)%mod;
        len--;
    }
    return ans;
}

int main(){
    freopen("power.in","r",stdin);
    freopen("power.out","w",stdout);
    scanf("%s",str);
    printf("%I64d\n",mpow(3));
    return 0;
}

矩阵快速幂

struct Matrix{
    const int maxn = 2;

    int mat[maxn][maxn];
    void unit(){
        for(int i=0;i<maxn;i++)
           for(int j=0;j<maxn;j++)
              mat[i][j]=(i==j);
    }

    void zero(){
        for(int i=0;i<maxn;i++)
           for(int j=0;j<maxn;j++)
              mat[i][j]=0;
    }
};

Matrix operator *(Matrix a,Matrix b){
   Matrix c;c.zero();
   for(int k=0;k<maxn;k++)
     for(int i=0;i<maxn;i++)
      for(int j=0;j<maxn;j++)
        c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod;
    return c;
}

Matrix mpow(Matrix a,int b){
    Matrix rt;
    for(rt.unit();b;b>>=1,a=a*a)
        if(b&1) rt=rt*a;
    return rt;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值