• 大数乘法取模运算(二进制)


    问题:

    求 (a*b) % m 的值,其中 a,b,m 是1到10^18;

    如果直接乘的话,因为a和b还有m都很大,那么会溢出long long,所以需要一些方法;

    朴素的想法是用数组模拟高精度,但是比较麻烦;

    二进制数也是满足十进制竖式乘法运算规律的,我们可以模拟二进制乘法竖式来计算(a*b)%m,因为其每次只相当于a乘2,再取模就不会溢出了;

    代码:

     1 #include <bits/stdc++.h>
     2 #define MAXN 100000+10
     3 #define ll long long
     4 using namespace std;
     5 
     6 ll multi(ll a, ll b, ll m)
     7 {
     8     ll ans=0;
     9     while(b)
    10     {
    11         if(b&1) (ans+=a)%=m;
    12         (a<<=1)%=m;
    13         b>>=1;
    14     }
    15     return ans;
    16 }
    17 
    18 int main(void)
    19 {
    20     std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    21     ll a, b, m;
    22     cin >> a >> b >> m;
    23     cout << multi(a, b, m) << endl;
    24     return 0;
    25 }
  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    将Ojective-C代码移植转换为Swift代码
    Swift
    房费制——报表(1)
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5886626.html
Copyright © 2020-2023  润新知