简单快速幂模板,注意三个函数的b都不能小于0,因为-1>>1还是-1,会死循环。平常一般是拿来计算两个正数的快速幂或者快速乘法。
//直接快速幂,计算a的b次方对c求余
ll qpow(ll a,ll b,ll c) //转化为二进制进行快速运算
{
ll ans = 1;
while(b)
{
if(b&1) //相当于b%2==1
ans = (ans*a)%c;
a = (a*a)%c;
b>>=1; //相当于b/=2
}
return ans;
}
//利用快速乘法优化a*a
ll quick_mul(ll a,ll b,ll c)
{
ll ans = 0;
while(b)
{
if(b&1)
ans=(ans+a)%c;
a=(a+a)%c;
b>>=1;
}
return ans;
}
ll qpow(ll a,ll b,ll c) //计算a的b次方对c求余,转化为二进制进行快速运算
{
ll ans = 1;
while(b)
{
if(b&1) //相当于b%2==1
ans = quick_mul(ans,a,c); //这里传入a作为quick_mul的b,因此a也不能小于0
a = quick_mul(a,a,c);
b>>=1; //相当于b/=2
}
return ans;
}