用法:快速计算a*b%mod的结果。
对于大数直接乘可能会爆long long,用快速乘法每一步都取余不会爆掉。
实现原理:
对于乘数b来说,一定可以拆成2进制,比如110101。有一些位为0,有一些位为1。根据乘法分配律:a*b=a*(b1+b2+b3+……)
那么对于a*53 = a*110101(二进制)= a*(100000+10000+100+1)=a*(100000*1+10000*1+1000*0+100*1+10*0+1*1)。
具体实现过程:定义ans=0用于保存答案,每一位让a*=2,在根据b的对应为1看是不是加上此时的a。
代码:
ll q_mul(ll a, ll b, ll mod){
ll ans=0;
while(b){
if(b & 1) ans=(ans+a)%mod;
a=(a<<1)%mod;
b>>=1;
}
return ans;
}