zoukankan      html  css  js  c++  java
  • 64位整数乘法

    //总结自李煜东著《算法竞赛进阶指南》

    问题:求a乘b对p取模的值,其中1<=a,b,p<=10^18。

    简单的暴力相乘显然会溢出(相当于对64位整数最大值+1取模),对a进行b次累加显然会超时。

    法一:

    仿照快速幂,用二进制表示b。

     1 typedef long long ll;
     2 
     3 inline ll mul(ll a, ll b, ll p) {
     4     a %= p, b %= p;
     5     ll ans = 0;
     6     while (b) {
     7         if (b & 1) ans = (ans + a) % p;
     8         a = a * 2 % p, b >>= 1;
     9     }
    10     return ans;
    11 }

    法二:

    利用a*b%p=a*b-floor(a*b/p)*p求解,其中floor函数表示向下取整。

     1 typedef long long ll;
     2 
     3 inline ll mul(ll a, ll b, ll p) {
     4     a %= p, b %= p;
     5     ll c = (long double)a * b / p;
     6     ll ans = a * b - c * p;
     7     if (ans < 0) ans += p;
     8     else if (ans >= p) ans -= p;
     9     return ans;
    10 }

    值得一提的是,尽管a*b和c*p可能溢出,但这并不影响,因为a*b-c*p一般不会超过p-1,我们只关心他们的低位。

  • 相关阅读:
    webservice4
    webservice2
    webservice3
    webservice
    java 堆栈分析4
    java 堆栈分析3
    java 堆栈分析2
    java 堆栈分析
    数据库的Timeout
    node.js小结 2
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/10325252.html
Copyright © 2011-2022 走看看