我想计算(a*b*c*d/e)%m
我a,b,c,d,e
订单10^18
的位置e
。 a*b*c*d
完全划分{{1}}。问题是我无法将它们相乘,因为我无法存储它们,因为它们的范围(10 ^ 72)。再说一次,我也不能先拿模数?我该怎么办?
答案 0 :(得分:7)
使用模块化算术属性并e
除a*b*c*d
。还假设m*m
不会溢出所使用的数据类型。
如果a1 = b1 mod n
和a2 = 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;