1.朴素算法o(n)
long long qpow3(long long a,long long b){
long long s=1;
for(int i=1;i<=b;i++)
s=s*a%mod;
return s;
}
2.1递归快速幂o(logn)
long long qpow(long long a,long long b){
if(b==0)return 1;
else if(b%2==0){
t=qpow(a,b/2);
//不能直接return qpow(a,b/2)*qpow(a,b/2)%mod,改写法会退化成o(n),因为要递归求两次qpow()
return t*t%mod;
}
else {
return qpow(a,b-1)*a%mod;
}
}
2.2非递归写法o(logn)
long long qpow1(long long a,long long b){
long long s=1;
while(b){
if(b%2==1)s=s*a%mod;
a=a*a%mod;
b=b/2;
}
return s;
}
3.终极位运算写法olong(n)
long long qmi(long long a,int b)
{
long long res=1;
while(b)//对b进行二进制化,从低位到高位
{
//如果b的二进制表示的第0位为1,则乘上当前的a
if(b&1) res = res *a %mod;
//b右移一位
b>>=1;
//更新a,a依次为a^{2^0},a^{2^1},a^{2^2},....,a^{2^logb}
a=a*a%mod;
}
return res;
}