变量first_variable
始终是某个数字的模mod_value
。
在每个步骤中first_variable
都会乘以一些数字second_variable
。
所有三个变量的范围都是1
到10^18
。
为此我建立了一个公式,
first_variable = ((first_variable%mod_value)*(second_variable%mod_value))%mod_value
但这给出了错误的答案,
例如,如果first_variable and second_variable
为(10^18)-1
且mod_value = 10^18
请建议我使用方法,以便first_variable
始终给出正确答案。
答案 0 :(得分:0)
似乎您正在使用运算符,其中使用64位整数实现算术运算。您可以使用2 ^ 32之类的乘数来检查:如果它们的乘积为0,我的猜测是正确的。在这种情况下,您应该切换到一个任意长的算术实现,或至少一个比当前长得多的算术实现。例如。 Python支持最多2 ^ 1016(256 ^ 127)的整数,对于Erlang也是如此。
我在评论中看到你使用C ++。如果是这样,请查找GMP库和类似物。或者,如果128位足够,现代GCC通过自己的库支持它。
答案 1 :(得分:0)
这基本上是溢出,因此您应该为mod_value使用不同的值(最多10 ^ 9)或限制第一个值和第二个值的范围。
答案 2 :(得分:0)
您的号码是O(10^36)
O(2^108)
,它不能适合java或C ++等语言中的任何原始数据类型。在C ++或Java中使用BigInt或在python中使用numpy来克服它。