快速幂

来源:互联网 发布:linux系统的基本命令 编辑:程序博客网 时间:2024/04/19 07:00

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

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 longusing 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;}
原创粉丝点击