二进制快速幂
一般这个就够了
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;
}