我正在尝试计算
((3 ^ n)-(3 *(2 ^ n))+ 3)在JAVA中为1
但是,按照问题陈述来计算它似乎需要很多时间。
double mul = Math.pow(3,k);
double mul2 = Math.pow(2,k);
double res = ((mul - ((3* mul2)) + 3 ) % (1000000000 + 7));
我面临的问题是
1) Time limit exceeded in java.(which should be less than 1 sec)
2) The result goes out of limit and thus provides wrong output.
任何改进代码/计算方法的建议都会有所帮助。如您所见,要显示的结果是模(1000000000 + 7)。
另外,我尝试编写自己的幂函数,在每次乘法后都要对这个模进行模运算,这也无济于事。
谢谢
最佳答案
避免使用BigIntegers并从头评估能力,这是一种幼稚且效率低下的方法。
使用模数算法逐步进行工作。
保留两个整数变量,分别保存Aₙ:= 3ⁿ mod 1000000007
和Bₙ:= 3×2ⁿ mod 1000000007
的值。
更新很明显:Aₙ₊ₗ= 3×Aₙ mod 1000000007
和Bₙ₊ₗ= 2×Bₙ mod 1000000007
。
对于模运算,我建议使用比较代替%
。
您很幸运2×1000000007
可以容纳32位带符号整数。但不是3×1000000007
,所以我建议将乘以3作为两个加法。
因此,您只需实现整数加减模1000000007
即可。
private static int sum(int x, int y)
{
return x >= 1000000007 - y ? x - (1000000007 - y) : x + y;
}
private static int sub(int x, int y)
{
return x < y ? x + (1000000007 - y) : x - y;
}
int n;
int a= 1;
int b= 3;
for (n= 1; n <= 109; n++)
{
a= sum(sum(a, a), a);
b= sum(b, b);
int res= sum(sub(a, b), 3);
}