在c ++中,当n超过64时,如何计算pow(2,n)?

时间:2019-08-02 17:39:55

标签: c++ c++11 unsigned-integer

所以,我是C ++编程的新手,我遇到了这个问题,需要计算 pow(2,n)/ 2 ,其中n> 64吗?

我尝试使用unsigned long long int,但由于c ++的限制仅为2 ^ 64。那么有什么方法可以计算出来。

编辑:

 1 < n < 10^5

表达式的结果用于进一步的计算

这个问题是在在线平台上提出的。因此,我无法使用gmp之类的库来处理大量数字。

问题

系统会为您提供大小为 N 的数组 A 。如果元素 Ai 的值( Ai )大于或等于 Ki Ki 是由元素 Ai 组成的数组 A 的子集总数。
数组的总电荷值定义为数组 mod(10 ^ 9)+7 中存在的所有带电元素的总和。
您的任务是输出给定数组的总电荷值。

2 个答案:

答案 0 :(得分:9)

这里的一个重要细节是,系统不会要求您为巨型n计算2 n 。而是要求您为大n计算2 n mod 10 9 + 7,这是另一个问题。

例如,假设您要计算2 70 mod 10 9 +1。请注意,2 70 不适合64位机器字。但是,2 70 = 2 30 ·2 35 和2 35 确实适合64位计算机字。因此,我们可以进行此计算以获得2 70 mod 10 9 + 7:

  

2 70 (mod 10 9 + 7)

     

= 2 35 ·2 35 (mod 10 9 + 7)

     

=(2 35 mod 10 9 + 7)·(2 35 mod 10 9 + 7 )mod 10 9 + 7

     

=(34359738368 mod 10 9 + 7)·(34359738368 mod 10 9 + 7)mod 10 9 + 7

     

=(359738130·359738130)mod 10 9 + 7

     

= 129411522175896900 mod 10 9 + 7

     

= 270016253

更一般而言,通过使用repeated squaring,您可以为n的任意值计算2 n mod 10 9 + 7一个64位整数。

希望这会有所帮助!

答案 1 :(得分:5)

认真进行数字工作的常用方法是重写公式。您存储log(x)而不是x,然后当您确实需要x时,通常会在上下文中您根本不需要所有这些数字。