AcWing90. 64位整数乘法

题目

求 a a a 乘 b b b 对 p p p 取模的值。

输入格式

第一行输入整数 a a a,第二行输入整数 b b b,第三行输入整数 p p p。

输出格式

输出一个整数,表示 a*b mod p 的值。

数据范围

1 ≤ a , b , p ≤ 1 0 18 1≤a,b,p≤10^{18} 1≤a,b,p≤1018

输入样例

复制代码
3
4
5

输出样例

复制代码
2

思路

C++ 内置的最高整数类型是 64 位,现在 a ∗ b a * b a∗b mod p p p 中的三个变量 a , b , p a, b, p a,b,p 都在 1 0 18 10^{18} 1018 级别,则不存在一个可供强制转换的 128 位整数类型,需要一些特殊的处理办法。

类似快速幂 的思想,把整数 b b b 用二进制表示,即 b = c k − 1 2 k − 1 + c k − 2 2 k − 2 + . . . + c 0 2 0 b = c_{k-1}2^{k-1} + c_{k-2}2^{k-2} + ... + c_02^0 b=ck−12k−1+ck−22k−2+...+c020,则 a ∗ b = c k − 1 ∗ a ∗ 2 k − 1 + c k − 2 ∗ a ∗ 2 k − 2 + . . . + c 0 ∗ a ∗ 2 0 a * b = c_{k-1} * a * 2^{k-1} + c_{k-2} * a * 2^{k-2} + ... + c_{0} * a * 2^{0} a∗b=ck−1∗a∗2k−1+ck−2∗a∗2k−2+...+c0∗a∗20。

因为 a ∗ 2 i = ( a ∗ 2 i − 1 ) ∗ 2 a * 2^{i} = (a * 2 ^{i-1}) * 2 a∗2i=(a∗2i−1)∗2,若已求出 a ∗ 2 i − 1 a * 2^{i-1} a∗2i−1 mod p p p,则计算 ( a ∗ 2 i − 1 ) ∗ 2 (a * 2 ^{i-1}) *2 (a∗2i−1)∗2 mod p p p 时,运算过程中每一步的结果都不超过 2 ∗ 1 0 18 2 * 10^{18} 2∗1018,仍然在 64 位整数 long long 的表示范围内,所以很容易通过 k k k 次递推求出每个乘积项。当 c i = 1 c_i = 1 ci=1 时,把该乘积项累加到答案中即可。

时间复杂度为 O ( l o g 2 b ) O(log_2b) O(log2b)。

代码

cpp 复制代码
#include <cstdio>

using namespace std;

typedef long long ll;

ll mul(ll a, ll b, ll p) {
    
    ll ans = 0;
    
    while (b) {
        if (b & 1) ans = (ans + a) % p;
        b >>= 1;
        a = a * 2 % p;
    }
    
    return ans;
}

int main() {
    ll a, b, p;
    scanf("%lld%ld%lld", &a, &b, &p);
    printf("%lld\n", mul(a, b, p));
    return 0;
}
相关推荐
Thanks_ks17 天前
19 C 语言位运算、赋值、条件、逗号运算符详解:涵盖运算符优先级与复杂表达式计算过程分析
位运算·运算符优先级·赋值运算符·三元运算符·c 语言运算符·逗号运算符·复杂表达式解析
Dream it possible!25 天前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
ErizJ1 个月前
Golang | 位运算
开发语言·后端·golang·位运算
吗喽对你问好1 个月前
Java位运算符大全
java·开发语言·位运算
小卡皮巴拉1 个月前
【力扣刷题实战】丢失的数字
c++·算法·leetcode·位运算
ゞ 正在缓冲99%…1 个月前
leetcode201.数字范围按位与
java·数据结构·算法·位运算
清羽_ls1 个月前
leetcode-位运算
前端·算法·leetcode·位运算
daily_23332 个月前
coding ability 展开第九幕(位运算——进阶篇)超详细!!!!
算法·位运算
_唐浮3 个月前
【HarmonyOS Next】常见的字节转换
harmonyos·arkts·位运算·16进制
天天超方的3 个月前
【题解】CF2077B Finding OR Sum
位运算·交互题·cf