位运算
64位整数乘法(mod)
ull a,b,p;
int main(){
cin>>a>>b>>p;
a=a%p,b=b%p;
ull ans,c=(long double)a*b/p;
ans=a*b-c*p;
if(ans<0)ans+=p;
cout<<ans;
}
double 在运算溢出的时候会舍弃低位(科学计数法)
原理:\(a \times b \% p=a \times b-(a \times b)/p \times p\)
首先对a、b取模mod,ab的位数(二进制)就不会超过p的位数的两倍,每次溢出时只会舍弃2p-1e18,即不会舍弃超过p的位数
考虑ab中到低于p的位数的位在整数除法之后都会变成小数舍弃,只要溢出时不舍弃超过p位,那么都不会对整数部分造成改变
比如 a、b长度为10,p长度为10 在a*b后舍弃两位,而在正常的整数乘法的时候会舍弃10位,则自然溢出一定不会造成精度丢失