大数相乘取模

https://www.cnblogs.com/shuaihui520/p/9619322.html

记一下

a∗bmodp=a∗b−⌊a∗bp⌋∗pa∗bmodp=a∗b−⌊a∗bp⌋∗p
用long double来计算⌊a∗bp⌋⌊a∗bp⌋,误差很小,因为long double的特性是存不下就舍弃低位,再把它转成long long。直接用long long来计算。long long爆掉了会让符号位出错,但是小于2^63的位是不会挂的,这正好符合我们的需求。

ll mul(ll a,ll b,ll p){
	a=(a<0)?a+p:a;
	b=(b<0)?b+p:b;
    ll tmp=(a*b-(ll)((long double)a/p*b+1e-8)*p);
    return tmp<0?tmp+p:(tmp>=p?tmp-p:tmp);
}

把a*b%p变成a*b-(a*b div p * p),过程用long double算,之后强转long long

posted @ 2024-07-24 18:19  gmh77  阅读(5)  评论(0编辑  收藏  举报