gpt4 book ai didi

c++ - 如何在 C++ 中计算 A、B、C <= 10^18 的 (A*B)%C?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:59 24 4
gpt4 key购买 nike

例如,A=10^17,B=10^17,C=10^18。
A*B 的乘积超出了 long long int 的限制。
此外,编写 ((A%C)*(B%C))%C 也无济于事。

最佳答案

假设您希望保留在 64 位整数运算范围内,您可以使用二进制长除法,它归结为一堆加法和乘法运算。这意味着您还需要这些运算符的防溢出版本,但它们相对简单。

下面是一些 Java 代码,它假设 A 和 B 已经是正数并且小于 M。如果不是,很容易事先使它们如此。

// assumes a and b are already less than m
public static long addMod(long a, long b, long m) {
if (a + b < 0)
return (a - m) + b; // avoid overflow
else if (a + b >= m)
return a + b - m;
else
return a + b;
}

// assumes a and b are already less than m
public static long multiplyMod(long a, long b, long m) {
if (b == 0 || a <= Long.MAX_VALUE / b)
return a * b % m; // a*b > c if and only if a > c/b
// a * b would overflow; binary long division:
long result = 0;
if (a > b) {
long c = b;
b = a;
a = c;
}
while (a > 0) {
if ((a & 1) != 0) {
result = addMod(result, b, m);
}
a >>= 1;
// compute b << 1 % m without overflow
b -= m - b; // equivalent to b = 2 * b - m
if (b < 0)
b += m;
}
return result;
}

关于c++ - 如何在 C++ 中计算 A、B、C <= 10^18 的 (A*B)%C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20912109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com