【问题标题】:An efficient way to calculate extremely large powers of 2一种计算 2 的极大幂的有效方法
【发布时间】: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


【解决方案1】:

如果你用 2^something_big 取模某个值,这意味着你不必输出超出something_big 的位。例如x%power(2,10) == x%(1<<10) == x&(1<<10 - 1) == x&1023

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

顺便说一句。存储 99999 位是可行的。它只有 13kB。

【讨论】:

  • 您不需要 99999 位来找到解决方案,long long 或者 int 就足够了。
  • 那是因为(10^9 + 6) * 2 < 2^31
  • 我不确定双模的目的是什么,所以假设我误解了原始计算的一些内容。
  • 问题在哪里说模数是 2^something?
猜你喜欢
  • 2011-05-05
  • 2018-05-28
  • 2013-04-06
  • 2013-03-09
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多