如何在C ++中计算2 ^ n + 2 ^ n-1 + ... + 2 ^ k mod 2 ^ 60,其中2 ^ i的值可能非常大?

问题描述

对于编程问题,我必须打印表达式2^n+2^n-1+...+2^k mod 2^60,其中1<=k<n<=240

基本上,如何计算2 ^ 240 mod 2 ^ 60?如果可以解决,我也可以使其适用于n

在这里阅读答案: How can I calculate 2^n for large n?

但是,这会计算出较大的n而不是2^n

有帮助吗?

解决方法

2^k + 2^k+1 + ... + 2^n-1 + 2^n mod 2^60

=

2^k * (2^0 + 2^1 + ... + 2^n-k-1 + 2^n-k) mod 2^60

=

2^k * ((2^n-k+1)-1) mod 2^60

=

(2^n+1 - 2^k) mod 2^60

=

(2^n+1 mod 2^60 - 2^k mod 2^60) mod 2^60
  • k> = 60:结果为0,因为2 ^ n + 1和2 ^ k都可以除以2 ^ 60
  • k
  • n> = 59:结果为-2 ^ k
  • n

由于条件的缘故,所有这些数字都可以计算出来,因为它可以正确地适合长变量(64位)。