如何降低以下代码的复杂性?

时间:2017-11-17 18:12:26

标签: java algorithm data-structures time-complexity

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    static int totalSum(long n, int k) {
        long i=1;
        long sum=0;
        if(n==1||n==2)
            return 0;
        else{
            while(i!=n-1){
                sum+=Math.pow((double)(n-i),(double)k);
                i++;
            }
            int c = (int)sum%1000000009;
            return c;
        }

    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int q = in.nextInt();
        for(int a0 = 0; a0 < q; a0++){
            long n = in.nextLong();
            int k = in.nextInt();
            int result = totalSum(n, k);
            System.out.println(result);
        }
        in.close();
    }
}

约束 - 1&lt; = n&lt; = 10 ^ 18                1·; = K&LT; = 1000 。每当我运行这个程序时,它就会被卡住更大的n值。 有没有其他方法来解决这个程序或降低其复杂性,因为我认为这是阻止我得到答案的唯一方法。

P.S。:任务是 - 您正计划下一届FIFA世界杯,并且您正在计算需要建造的高速公路数量,以便将城市与场地连接起来。 你的国家有n个城市,所有城市都位于一条名为“公路”的直道上。如果你想从城市x到城市y(其中x <= y),你需要经过城市x,x + 1,x + 2 ..... y-1,y。

高速公路的要求如下:

所有比赛将在第n个城市举行。 需要建造新的双向道路,称为超高速公路&#34;,以便可以直接从任何其他城市访问第n个城市。 您还需要支付第二个条件的费用。工程团队知道如果超高速公路的长度为l,那么它将花费l ^ k,其中k是整数常数。城市x和y之间的超高速公路的长度是| x-y |。

对于这个问题,您只需要找到成本的粗略估计,因此,找到总成本模数1000000009。

1 个答案:

答案 0 :(得分:0)

考虑使用BigIntegerBigDecimal代替longdouble使用非常大的数字。

见这个例子:

BigInteger bi1, bi2;
int exponent = 2;
bi1 = new BigInteger("6");

// perform pow operation on bi1 using exponent
bi2 = bi1.pow(exponent);

String str = "Result is " + bi1 + "^" + exponent + " = " + bi2;
System.out.println(str);