快速乘法的说法来源于快速幂,因为两者的思想一致。快速幂是为了计算计算取模结果,的确是快的。而快速乘法主要是模数超过九次方时使用,因为两数相乘会longlong溢出,会比直接乘法慢,但是保证了正确性。所以说快速乘法并不快,想要比正常乘法快也是不现实的,快速乘法本来就是为了保证正确性而牺牲效率,自己实现了一遍乘法。要说快的话只能去和直接累加相比,就像快速幂比直接累乘取模快。
// 类似快速幂
// 时间复杂度log(n)
// 写法1
int qmul(int a, int b, int p){
int ret = 0;
while (b){
if (b & 1) ret = (ret + a) % p;
b >>= 1;
a = (a + a) % p;
}
return ret;
}
// 写法2
typedef long long ll;
ll qmul(ll a, ll b, ll p){
ll ret = 0;
for (; b; b >= 1){
if (b & 1) ret = (ret + a) % p;
a = a * 2 % p;
}
return ret;
}