zoukankan      html  css  js  c++  java
  • 大数乘法取模运算(二进制)

    问题:

    求 (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 }
  • 相关阅读:
    header
    panel----单个基础版
    vue-demo
    js不同类型变量比较
    reset.css
    关于各个浏览器的兼容问题
    git
    AMD与CMD区别
    喜欢前端的看过来哦
    js中数组去重的几种方法
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5886626.html
Copyright © 2011-2022 走看看