快速乘法的说法来源于快速幂,因为两者的思想一致。快速幂是为了计算计算取模结果,的确是快的。而快速乘法主要是模数超过九次方时使用,因为两数相乘会longlong溢出,会比直接乘法慢,但是保证了正确性。所以说快速乘法并不快,想要比正常乘法快也是不现实的,快速乘法本来就是为了保证正确性而牺牲效率,自己实现了一遍乘法。要说快的话只能去和直接累加相比,就像快速幂比直接累乘取模快。

    1. // 类似快速幂
    2. // 时间复杂度log(n)
    3. // 写法1
    4. int qmul(int a, int b, int p){
    5. int ret = 0;
    6. while (b){
    7. if (b & 1) ret = (ret + a) % p;
    8. b >>= 1;
    9. a = (a + a) % p;
    10. }
    11. return ret;
    12. }
    13. // 写法2
    14. typedef long long ll;
    15. ll qmul(ll a, ll b, ll p){
    16. ll ret = 0;
    17. for (; b; b >= 1){
    18. if (b & 1) ret = (ret + a) % p;
    19. a = a * 2 % p;
    20. }
    21. return ret;
    22. }