两者都用了二进制的性质,慢速乘法避免了乘法爆long long
快速幂加速乘方运算;
快速幂
LL fast_pow(LL a,LL k,LL mo)
{
long long ans=1;
for(;k;k>>=1,a=a*a%mo)
if(k&1) ans=ans*a%mo;
return ans;
}
while(k)
{
if(k&1) ans=ans*a%mo;
a=(a*a)%mo;
k>>=1;
}
一个数的n次幂等于n的二进制次幂的乘积
such as k^7=k^1 k^2 K^4;
所以快速幂就是通过乘法处理出k的2进制c次幂;以加速幂运算
复杂度log
慢速乘法
原理同为二进制,把其中一个乘数,拆成二进制的和,分别与另一个乘数相乘,并取模
LL low_c(LL a,LL b){
LL ans=0;
while(b)
{
if(b&1)
{
b--;
ans=(ans+a)%mo;
}
b>>=1;
a=(a<<1)%mo;//此处乘2,以弥补b左移一位的损失
}
return ans;
}
另有一种神奇写法
LL low_c1(LL a,LL b)
{
LL tmp=a*b-mo*(LL)((long double)a*b/mo);
if (tmp<0) tmp+=mo;
return tmp;
}