我正在为我的竞争性编程课程编写一个程序,我无法克服一个问题。此问题要求您根据特定条件计算某个字符串的所有排列,并且我的程序会这样做。但是,问题是当输入是一个非常大的字符串时,它可以达到10 ^ 6。
问题的解决方案是2 ^结果,其中结果取决于输入字符串的长度,因此对于10 ^ 6,它可以高达5 * 10 ^ 5。解决方案必须以以下形式给出:结果%(10 ^ 9 + 7)。
我已经尝试将解决方案放入BigInteger,它耗尽了堆空间。我尝试过使用双打,它会溢出。我有什么遗失或有办法解决这个问题吗?谢谢。
以下是一些尝试:
System.out.println((int) (Math.pow(2, counter) % (1e9 + 7)));
//it prints out 0, probably due to overflow?
DecimalFormat df = new DecimalFormat("#");
System.out.println(df.format(Math.pow(2, counter) % (1e9 + 7)));
//prints out �
答案 0 :(得分:4)
你不需要处理非常大的数字就可以了。
该作业旨在帮助您实施modular exponentiation。 BigInteger已将其实现为modPow。它允许您计算(b^e) % c
,而无需处理大于c
的数字。
这是维基百科的伪代码,用于通过重复平方取幂后的余数:
function modular_pow(base, exponent, modulus)
if modulus = 1 then return 0
Assert :: (modulus - 1) * (modulus - 1) does not overflow base
result := 1
base := base mod modulus
while exponent > 0
if (exponent mod 2 == 1):
result := (result * base) mod modulus
exponent := exponent >> 1
base := (base * base) mod modulus
return result