快速乘
快速乘
原理:由于计算机底层设计的原因,做加法往往比乘法快的多,因此将乘法转换为加法计算将会大大提高(大数,比较小的数也没必要)乘法运算的速度,除此之外,当我们计算a*b%mod的时候,往往较大的数计算a*b会超出long long int的范围,这个时候使用快速乘法方法也能解决上述问题.
快速乘法的原理就是利用乘法分配率来将a*b转化为多个式子相加的形式求解(注意这时使用乘法分配率的时候后面的一个乘数转化为二进制的形式计算).举个栗子
20*14 = 20*(1110)2 = 20*(2^3)*1 + 20*(22)*1+20*(21)*1+20*(2^0)*0 = 160+80+40=280.
部分代码如下:
int fust_mul(int a,int b,int c)//相当于a*b%c,b被拆成二进制数,相当于a*(x1*2^0+x2*2^1+....+xn*2^n-1)
{
int ans=0;
a%=c;
while(b)//一直除到b为0
{
if(b%2)
ans=(ans%c+ans%c)%c;//同余定理
a=(a%c+a%c)%c;
b/=2;
}
return ans%c;
}