无法通过在线评审

时间:2016-12-22 21:48:00

标签: java string algorithm

在线评委不接受我的解决方案。任何帮助将不胜感激。

JP and Strings

  

1个字符的字符串只包含一个字母'a',   2个字符的字符串仅包含字母“a”和“b”。同样   26个字符的字符串由字母表中的所有小写字母组成,即   从A到Z'。如果字符串中没有字符,则该字符串有效   字符串,其位置与字母顺序相同。   例如,字符串“bac”无效,因为字符“c”为   字符串中的位置3(将字符串和字母都视为   1索引),与字母顺序相同。而   字符串“cab”有效。现在有一个函数F(N,L),使得

     

F(N,L)=长度为L的有效N字符串的数量。

     

输入:第一行将包含查询数量Q.下一个Q.   line将包含两个空格分隔的整数,包含N和L.

     

输出:对于每个查询,打印包含值的单行   函数F(N,L)。答案可能太大,所以打印模数   1000000007。

     

约束:1 <= Q <= 10 ^ 3 1&lt; = N <= 26 1 <= L <= 10 ^ 9

     

声明:给定两个整数N和L,其中N表示数字   字符和L表示字符串的长度。

我的解决方法是:

将有两种可能的用例:

1。)L&lt; = N如果字符串L的长度小于或等于N,则在每个位置我们可以选择N-1个字符,因此字符串的总数将是(N-1)^ L

2。)L> N如果字符串L的长度大于N,那么可能的字符串的数量将是:(N-1)^ N * N ^(LN)对于休息N位置,我们可以选择N-1个字符但是在第N个位置之后所有N个字符都可以使用。

代码:http://ideone.com/fzGLKH

public static void main(String[] args) throws IOException {
    FastScanner in = new FastScanner();
    int q = in.nextInt();
    int n,l;
    while(q>0){
        n = in.nextInt();
        l = in.nextInt();
        if(n<l){
            System.out.println((int)((Math.pow(n-1, n)*Math.pow(n, l-n))% 1000000007));
        }
        else{
            System.out.println((int)(Math.pow(n-1, l)% 1000000007));
        }
        q--;
    }

}

1 个答案:

答案 0 :(得分:1)

该错误是什么?

你在做Math.pow(n - 1, l) % 1000000007

问题的约束是1 <= l <= 1000000000,因此它可能是一个巨大的值,如10 ^ 9位数字。它会导致溢出,你无法得到正确答案。


错误的解决方案

如果你想计算a^b mod m (a^b is the bth power of a),你会怎么做? 您可以使用Exponentation by squaring算法来计算a^b mod m java中的算法如下:

public static long modpow(long a, long b, long m) {
    long ret = 1;
    while(b > 0) {
        if((b & 1) == 1) ret = ret * a % m;
        a = a * a % m;
        b >>= 1;
    }
    return ret;
}

时间复杂度为O(log b),因此您可以解决此问题!