java - 计算 2 的 k 次方

标签 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);
    }

这个 pow 函数超出了它的范围。任何好的解决方案。

最佳答案

基本上,f(g(x)) mod Mthe same作为 f(g(x) mod M) mod M。由于求幂只是很多乘法,您可以将单个求幂分解为许多乘法,并在每一步应用模数。即

10 * 2^5 mod 13

相同
10
* 2 mod 13
* 2 mod 13
* 2 mod 13
* 2 mod 13
* 2 mod 13

到目前为止,您可以通过不分解求幂来压缩循环;也就是说,这将再次给出相同的答案:

10
* 4 mod 13
* 4 mod 13
* 2 mod 13

Faruk 的递归解决方案展示了一种优雅的方式来做到这一点。

关于java - 计算 2 的 k 次方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56540040/

相关文章:

math - 宽高比计算

math - 如何确定一个向量是否在其他两个向量之间?

java - 为什么我不能打破 Java 循环

java - 我不断收到 'Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException : 30?

Java - 提高简单素数 validator 的性能

algorithm - 公式,圆的周长与矩形的角相交

math - 确定卡尔曼滤波器矩阵的协方差

java - Jackson - 自定义反序列化器不会读取 JSON 中的所有字段

c++ - 执行时间比较

performance - 下秩矩阵的计算