如何计算(a * b * c * d / e)%m f a,b,c,d,e是10 ^ 18的阶数?

时间:2014-09-11 14:13:55

标签: c algorithm

我想计算(a*b*c*d/e)%ma,b,c,d,e订单10^18的位置ea*b*c*d完全划分{{1}}。问题是我无法将它们相乘,因为我无法存储它们,因为它们的范围(10 ^ 72)。再说一次,我也不能先拿模数?我该怎么办?

1 个答案:

答案 0 :(得分:7)

使用模块化算术属性并ea*b*c*d。还假设m*m不会溢出所使用的数据类型。

作为modular arithmetic州:

如果a1 = b1 mod na2 = b2 mod n则:

a1 + a2 = b1 + b2 mod n
a1 - a2 = b1 - b2 mod n
a1 * a2 = b1 * b2 mod n

分区不在此处。这样你就可以使用:((a%m)*(b%m)*(c%m)*(d%m)/(e%m))%m

代码。

gcd_value = gcd(a, e);
result = (a / gcd_value) % m;
e /= gcd_value;
gcd_value = gcd(b, e);
result *= (b / gcd_value) % m;
e /= gcd_value;
gcd_value = gcd(c, e);
result *= (c / gcd_value) % m;
e /= gcd_value;
gcd_value = gcd(d, e);
result *= (d / gcd_value) % m;
result = result % m;