我正在解决一个问题和基本思想,以计算某个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);
}
此电源功能已超出其范围。任何好的解决方案。
答案 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
,您必须使用其他数据类型。