快速乘法模板
阿新 • • 發佈:2018-12-11
快速乘法使用二進位制將乘法轉化為加法,既加快可以加快運算速度,又可以防止直接相乘之後溢位
簡單的寫法:
ll quickMul(ll a,ll b,ll mod)
{
ll res=0;
while(b){
if(b&1) res=(res+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return res;
}
更快更高效的寫法:
ll mul(ll a,ll b,ll mod) { a%=mod; b%=mod; ll res=0; while(b){ if(b&1){ res+=a; if(res>=mod) res-=mod; } b>>=1; a<<=1; if(a>=mod) a-=mod; } return res; }
利用快速乘法優化的快速冪:
ll mul(ll a,ll b,ll mod) { a%=mod; b%=mod; ll res=0; while(b){ if(b&1){ //printf("%lld %lld %lld\n",a,b,res); res+=a; if(res>=mod) res-=mod; } b>>=1; a<<=1; if(a>=mod) a-=mod; } return res; } ll quickPow(ll a,ll b,ll m) { ll res=1; while(b){ if(b&1) res=mul(res,a,m); a=mul(a,a,m); b>>=1; } return res; }