在乘方运算时,千万不要在用这个了
long long pow(long long a,long long b){
long long s=1;
while(b--) s*=a;
return s;
}
的复杂度在大规模运算时接受不了的
把底数除2,结果自乘可以把复杂度除以2
但是这样楚是不够的,但是却给了我们一个启发
除很多次,就能把复杂度降到log级别
但如果是奇数,就要先减一,降到偶数
long long quickpow(long long a,long long b){
long long ans=1;
while(b){
if(b%2==0){
b/=2;
a*=a;
}
else{
ans*=a;
b--;
}
}
return ans;
}
但是既然是快速幂,就要让它更快
位运算!
long long quickpow(long long a,long long b){
long long ans=1;
while(b){
if(!(b&1)){
b>>=1;
a*=a;
}
else{
ans*=a;
b--;
}
}
return ans;
}
但,这还不够,别忘了右移一位如果是奇数,还会减一再除以2
所以,最终代码出来了
long long quickpow(long long a,long long b){
long long ans=1;
while(b){
if(b&1) ans*=a;
a*=a;
b>>=1;
}
return ans;
}
虽然有递归解法,但这里不在给代码,个人不建议用递归,因为递归太费空间,往深了递归还费时间