在线评委不接受我的解决方案。任何帮助将不胜感激。
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个字符都可以使用。
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--;
}
}
答案 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)
,因此您可以解决此问题!