【发布时间】:2019-12-05 21:51:56
【问题描述】:
我正在解决一个问题,该问题需要我计算一组所有可能子集的平方和。我需要返回这个总和,模 10^9+7
我明白其中的逻辑。我只需要将平方和并将结果乘以 2^N-1,其中 N 是集合的大小。
但问题是 N 可以大到 10^5。 为此,我得到一个整数溢出。 我研究了快速模幂运算,但我仍然会在哪里存储像 2^100000 这样大的东西? 我可以在计算 2 的幂时使用模数来降低数字吗?这不会改变最终值吗?
如果有人能告诉我如何获取它或阅读什么内容,那将非常有帮助。
【问题讨论】:
-
为什么需要存储 2^100000 这么大的东西?为什么你甚至需要存储大于 10^9+7 的东西?
-
见
boost::multiprecision。 -
(2^N-1)%(10^9 + 7)只需要计算一次。然后使用身份(a * b)%c == ((a % c) * (b % c))%c。无论如何,在计算平方和(模 10^9 + 7)时,您可能需要做类似的事情以避免溢出。 -
power by squaring 直接以模计算不会溢出...参见modpow in here 它以 NTT 类的模
p算术完成 -
使用 bignum 库(例如GMP)。
标签: c++ math bit-shift exponentiation