计算
与二进制取幂的思想一样,这次我们将其中的一个乘数表示为若干个 2 的整数次幂的和的形式。因为在对一个数做乘 2 并取模的运算的时侯,我们可以转化为加减操作防止溢出。
递归方法如下:
ll p;
ll qmul(ll a, ll b, ll p)
{
ll res = 0;
a = ((a%p)+p)%p;
b = ((b%p)+p)%p;
if(a<b)
swap(a,b);
while(b)
{
if(b&1)
res = (res+a)%p;
a = (a+a)% p;
b >>= 1;
}
return res;
}
ll qpow(ll a,ll b,ll p)
{
ll ans=1;
a = ((a%p)+p)%p;
b = ((b%p)+p)%p;
while(b)
{
if(b&1)
ans = qmul(ans,a,p);
a = qmul(a,a,p);
b >>=1;
}
return ans;
}