当计算
a
∗
b
%
m
a*b\%m
a∗b%m的时候,往往较大的数在计算
a
∗
b
a*b
a∗b时会超出long long的范围,因此就可以使用快速乘的思想,快速乘和快速幂的思想非常相似,快速乘的原理就是利用乘法分配律,把
b
b
b转化为二进制数的形式,跟快速幂的做法相似:遍历每一位,在每一轮都把
a
a
a扩大为自身的两倍,如果当前位是1,则加上当前的
a
a
a。
示例代码如下:
typedef long long LL;
LL binaryMul(LL a,LL b,LL m) {
LL ans = 0;
while(b > 0) {
if(b & 1) ans = (ans + a) % m;
a = (a + a) % m;
b >>= 1;
}
return ans;
}