一、介绍
1.目的
计算乘法时,可能在结果还未出来时就已经爆掉了,以至于无法正确对结果取模,所以需要用快速乘来把乘法操作进行细分,保证结果取模的正确性。
2.原理
以
5
∗
10
5*10
5∗10为例:
将10划分为二进制表达:1001
那么计算5*10就可以划分:
5
∗
(
2
3
∗
1
+
2
2
∗
0
+
2
1
∗
0
+
2
0
∗
1
)
5*(2^3*1+2^2*0+2^1*0+2^0*1)
5∗(23∗1+22∗0+21∗0+20∗1)
我们的操作就是把乘法划分为这几个项的相加,过程中进行取模。
二、实现代码
typedef long long ll;
ll quick_multiply(ll a,ll b,ll mod){
ll ans=0;
a%=mod;
b%=mod;
while(b){
if(b&1) ans=(ans+a)%mod;
b>>=1;
a=(a+a)%mod;
}
return ans;
}