【模板】快速乘

快速乘

快(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

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

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

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

update 2021/10/03

请教了老师,又进行了实验。
得出以下结论:

  • 第一个板子无论什么情况都可以,也不用考虑先取模后取模的问题。
  • 第二个板子若是负数且不处理会出错,因为其并没有考虑负数情况,每次ans+=k,而k为负数时应改为ans-=k。
posted @ 2021-06-09 23:47  尹昱钦  阅读(67)  评论(0编辑  收藏  举报