• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【慢速加实现64位乘法】AcWing90 64位整数乘法

题意

求\(a*b\%q(1 \leq a,b,q \leq 10^{18})\)的值。

题解

在计算机中,数字都是以二进制数表示的。例如:\(5_{10}\)的二进制数为\(101_2\)。
对于\(2\)的幂级数,都可以表示为:\(1<<n\)。
那么\(5_{10}\)就可以用多个\(2\)的幂级数表示为:

\[101_2=(1<<0)+(1<<2) \]

\(\because\)乘法满足分配律
\(\therefore a * b\)可以表示为:

\[a*b=a*(b关于2的幂级数和) \]

由于a和b的数据范围都会达到\(10^{18}\),若直接使用乘法操作,则会爆\(long long\),所以当两个数不能直接相乘时就考虑使用加法来实现乘法。
一个不大于\(10_{18}\)的数乘以\(2\)是不会爆\(long long\)的
因此使用加法来实现乘法是可以实现题目要求的值的。

参考代码

C++
ll qadd(ll a, ll b, ll p) {
    Ll ans = 0;
    while (b) {
        if (b & 1) {
            ans = (ans + a) % p; 
        }
        a <<= 1;
        a %= p;
        b >>= 1;
    }
    return ans;
}

posted on 2024-05-01 19:45  RomanLin  阅读(38)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3