计算2的k次方

时间:2019-06-11 08:59:42

标签: java algorithm math

我正在解决一个问题和基本思想,以计算某个k的2的幂。然后将其乘以10。结果应为计算值mod 10 ^ 9 + 7。

给定约束1≤K≤10^ 9

我为此使用Java语言。我使用了'Math.pow'函数,但是2 ^ 10000000超出了它的范围,我不想在这里使用'BigInteger'。任何其他计算如此大的值的方法。

实际问题是:

对于每个有效i,编号为i的符号的一侧写有整数i,另一侧写有10K−i-1。

现在,马里奇卡(Marichka)想知道-有多少个路标上正好写着两个不同的十进制数字(总共在两侧)?由于此数字可能很大,因此请以10 ^ 9 + 7为模进行计算。

我正在使用这种pow方法,但这不是一种有效的方法。任何解决此问题的建议。

我原来的解决方案:

/* package codechef; // don't place package name! */

import java.util.*;
class Codechef
{
 public static void main (String[] args) throws java.lang.Exception
{
    Scanner scan = new Scanner(System.in);
    int t = scan.nextInt();
    while(t-->0){
        long k = scan.nextInt();
        long mul=10*(long)Math.pow(2, k-1);
        long ans = mul%1000000007;

        System.out.println(ans);
    }
  }
}

在举一些例子之后,我得出结论,此pow解决方案对于较小的约束有效,但对于较大的约束无效。

while(t-->0){
        long k = scan.nextInt();
        long mul=10*(long)Math.pow(2, k);
        long ans = mul%1000000007;

        System.out.println(ans);
    }

此电源功能已超出其范围。任何好的解决方案。

3 个答案:

答案 0 :(得分:5)

基本上,data.vsphere_vmfs_disks.available.disks.[N]Terraform 0.12一样是the same。由于幂运算只是很多乘法,因此您可以将单个幂运算分解成很多乘法,并在每个步骤取模。即

f(g(x)) mod M

相同
f(g(x) mod M) mod M

您可以通过不破坏指数到目前为止来压缩循环。也就是说,这将再次给出相同的答案:

10 * 2^5 mod 13

Faruk的递归解决方案展示了一种完美的方法。

答案 1 :(得分:2)

您需要使用将功率除以2的想法。

long bigmod(long p,long e,long M) {
    if(e==0)
        return 1;
    if(e%2==0) {
        long t=bigmod(p,e/2,M);
        return (t*t)%M;
    }
    return (bigmod(p,e-1,M)*p)%M;
}

while(t-->0){
        long k = scan.nextInt();
        long ans = bigmod(2, k, 1000000007);
        System.out.println(ans);
    }

您可以从此处获取有关该想法的详细信息:https://www.geeksforgeeks.org/how-to-avoid-overflow-in-modular-multiplication/

答案 2 :(得分:-1)

由于long的大小为8个字节,并且为signed数据类型,因此long数据类型的范围为-(2^63) to (2^63 - 1)。因此,要存储2^100,您必须使用其他数据类型。