所以,我是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 中存在的所有带电元素的总和。
您的任务是输出给定数组的总电荷值。
答案 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
时,通常会在上下文中您根本不需要所有这些数字。