由于计算机底层设计的原因,做加法往往比乘法快的多,因此将乘法转换为加法计算将会大大提高(大数,比较小的数也没必要)乘法运算的速度,除此之外,当我们计算a*b%mod的时候,往往较大的数计算a*b会超出long long int的范围,这个时候使用快速乘法方法也能解决上述问题.
快速乘法的原理就是利用乘法分配率来将a*b转化为多个式子相加的形式求解(注意这时使用乘法分配率的时候后面的一个乘数转化为二进制的形式计算).举个栗子
20*14 = 20*(1110)2 = 20*(2^3)*1 + 20*(2^2)*1+20*(2^1)*1+20*(2^0)*0 = 160+80+40=280.
上面即为快速乘法的基本原理
ll quick_mul(ll a, ll b, ll c)
{
ll ans = 0;
a %= c;
b %= c;
while (b) {
if (b & 1)//如果对应位为1
ans = (ans + a) % c;
a <<= 1; a %= c;//对应b的位每次的幂次会增加,加在a上
b >>= 1;
}
return ans;
}