我正在尝试计算
((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 1000000007Bₙ:= 3×2ⁿ mod 1000000007的值。

更新很明显:Aₙ₊ₗ= 3×Aₙ mod 1000000007Bₙ₊ₗ= 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);
}

09-27 09:22