因为有时候乘法会溢出,即使是long long也可能在乘法时爆掉。而使用快速乘会很高效完成乘法操作并且不会爆long long
快速乘就是将它转化为加法,不是一个一个的加,仿照2进制加法操作来完成(快速乘需要它为正数,不能为负数)
O(1)的快速乘
typedef long double ld;
typedef long long LL;
typedef unsigned long long ull;
LL ksc(LL x, LL y, LL p){
LL z = (ld)x / p * y;
LL res = (ull)x *y - (ull)z * p;
return (res + p) % p;
}
O(log)的快速乘
typedef long long LL;
LL ksc(LL x, LL y, LL p){
LL res = 0;
while(y){
if(y & 1) res = (res + x) % p;
x = (x << 1) % p; //将x不断乘2达到二进制
y >>= 1;
}
return res;
}