因爲有時候乘法會溢出,即使是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;
}