计算2的超大幂的有效方法

时间:2019-07-28 07:40:43

标签: c++ math bit-shift exponentiation

我正在解决一个问题,需要我计算集合的所有可能子集的平方和。我被要求退还这笔款项,取模10 ^ 9 + 7

我了解逻辑。我只需要对平方求和并将结果乘以2 ^ N-1,其中N是集合的大小。

但是问题是N可以大到10 ^ 5。 为此,我得到了整数溢出。 我研究了快速的模幂运算,但仍然在哪里存储2 ^ 100000的东西? 当我计算2的幂时,可以使用模数来降低数值吗?那不会改变最终值吗?

如果有人可以告诉我如何获得它或阅读什么,那将真的很有帮助。

1 个答案:

答案 0 :(得分:0)

如果您使用2 ^ {something_big对某些值取模,则仅意味着您不必输出something_big之后的位。例如x%power(2,10) == x%(1<<10) == x&(1<<10 - 1) == x&1023

因此,在您的情况下,问题是在计算模数之前的实际值,同时请记住您只需要99999位。所有高位都将被丢弃(如果我正确理解您的前提,则不会影响结果)。

顺便说一句。可以存储99999位。只有13kB。