【模板】快速乘

快速乘

快(gui)速乘,就是在两个数乘爆long long但是结果对long long范围内的数取模的情况下可以避免麻烦的高精度的技巧。
背过就好。

板子

下面的板子是接近O(1)的,利用了溢出与long double。

inline long long ksc(long long x,long long y,long long mod)
{
    return (x*y-(long long)((long double)x/mod*y)*mod+mod)%mod;     
}

下面的板子是O(log)的,利用了快速幂思想。

long long ksc(long long n, long long k, long long mod){
    long long ans = 0;
    while(k){
      if(k & 1) ans = (ans + n) % mod;
      k >>= 1;
      n = (n + n) % mod;
    }
    return ans;
}

update 2021/6/11

反复试验后发现,若是其中一个乘数原本是负数,则分两种情况:

  • 若一开始对其进行取模处理到正数,则应使用模板二
  • 若不对其进行处理,则应使用模板一

不知道对不对,后面请教大佬后会跟新的。

原文地址:https://www.cnblogs.com/yinyuqin/p/14869384.html