思想
[a^{b}=egin{cases}a^{frac {b}{2}} imes a^{frac {b}{2}}qquad amod b==0\ a^{frac {b}{2}} imes a^{frac {b}{2}} imes aqquad amod b==1end{cases}
]
为了防止溢出,通常会进行取模操作(下文n
即是模数)。
时间复杂度
[O(log n)
]
代码(递归、非递归)
typedef long long ll;
ll quickpow(ll a,ll b,ll n){
if(b==1) return a;
if(b%2==0){
ll t=quickpow(a,b/2,n);
return t*t%n;
}
else{
ll t=quickpow(a,b/2,n);
t=t*t%n;
t=t*a%n;
return t;
}
}
int quickpow(int a,int b,int n){
int ret=1;
while (b)
{
if(b%2==1) ret = ret*a%n;
a=a*a%n;
b>>=1;
}
return ret;
}