问题:如何求解如下所述情况时的 a*b%mod
(a、b、mod均在longlong范围内,但当a * b时会爆longlong)
一、快速乘【复杂度为O(log)】
当a*b爆longlong时,就不能直接去算了,此时可以用快速乘求解
快速乘与快速幂的思想基本一致,都是把b转化为二进制,a * b转化为多个式子相加的形式,在计算机中加法运算比乘法运算快。*
快速乘核心代码如下:
LL Quick_mul(LL a,LL b,LL mod) //LL为long long
{
LL ans=0;
a%=mod;
while(b){
if(b&1)ans=(a+ans)%mod;
a=(a<<1)%mod; //即:a=(a+a)%mod;
b>>=1;
}
return ans%c;
}
二、__int128
__int128可以装下2^128级别的大数据,不过它需要自己手写输出(但我们可以只在运算时用一下,
让a和b相乘的结果强制类型转换为__int128就行)
代码如下所示【复杂度接近O(1)】:
long long ans=((__int128)a*b)%mod;
三、快速乘【O(1)】
据说如果模数过大可能导致精度误差,故建议太大的mod不要使用这个方法。
inline LL multi(LL x,LL y,LL mod) //LL为longlong
{
LL tmp=(x*y-(LL)((long double)x/mod*y+1.0e-8)*mod);
return tmp<0 ? tmp+mod : tmp;
}