有(853467 * 21660421200929) % 100000000000007没有没有BigInteger库的构建方法(请注意,每个数字都适合64位整数,但乘法结果不适合)?
(853467 * 21660421200929) % 100000000000007
此解决方案似乎效率低下:
int64_t mulmod(int64_t a, int64_t b, int64_t m) { if (b < a) std::swap(a, b); int64_t res = 0; for (int64_t i = 0; i < a; i++) { res += b; res %= m; } return res; }
您应该使用俄罗斯农民乘法。它使用重复加倍来计算所有值(b*2^i)%m,如果设置了i第th位,则将它们相加a。
(b*2^i)%m
i
a
uint64_t mulmod(uint64_t a, uint64_t b, uint64_t m) { int64_t res = 0; while (a != 0) { if (a & 1) res = (res + b) % m; a >>= 1; b = (b << 1) % m; } return res; }
它改进了您的算法,因为它需要O(log(a))时间,而不是O(a)时间。
O(log(a))
O(a)
警告:无符号,仅在m小于或等于63位时有效。
m