zoukankan      html  css  js  c++  java
  • 64位整数乘法 (二进制思想)

    【题目】

      求a乘b对p取模的值,其中a,b,p均小于等于1e18大于等于1

    【算法】

      类似快速幂的二进制思想,将b看作一个二进制数展开为各个二进制位的值相加取模

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll a,b,p,ans,cur;
     5 int main()
     6 {
     7     cin>>a>>b>>p;
     8     for(; b; b>>=1)
     9     {
    10         if(b&1) ans = (ans+a) % p;
    11         a = a * 2 % p;
    12     }
    13     cout << ans << endl;
    14 }

    ---------------------------------------------------------------------------------------------------------------------

    【算法】

      a * b mod p = a * b - [a*b/p] * p (感觉这种有点不靠谱,最好别用,涉及浮点就开始玄学了)

     1 //玄学做法
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 typedef long long ll;
     5 ll a,b,p,c,ans;
     6 int main()
     7 {
     8     cin>>a>>b>>p;
     9     a %= p;
    10     b %= p;
    11     long long c = (long double)a * b / p;
    12     ans = a*b - c*p;
    13     if(ans >= p) ans -= p;
    14     else if(ans < 0) ans += p;
    15     cout << ans << endl;
    16 }
  • 相关阅读:
    traceroute工具
    tcpdump抓包
    Linux 信号表 signals
    Bloom Filter (海量数据处理)
    socks v5 协议解析
    Vim插件推荐
    建堆复杂度O(n)证明
    使用Vundle管理Vim插件
    VB调用C# dll
    域PC脱域
  • 原文地址:https://www.cnblogs.com/Willendless/p/9309308.html
Copyright © 2011-2022 走看看