我的解决方案不被在线法官接受任何帮助都将不胜感激。
JP and Strings
只有一个字母“a”组成的单字符字符串,
双字符字符串仅由字母“A”和“B”组成。类似地
26个字符串由字母表中的所有小写字母组成,即
从“A”到“Z”。如果在
与字母顺序中的位置相同的字符串。
例如,字符串“bac”无效,因为字符“c”位于
字符串中的位置3(将字符串和字母都看作
1-索引)与字母顺序相同鉴于
字符串“cab”有效现在有一个函数F(N,L)这样,
F(N,L)=长度为L的有效N个字符串的数目。
输入:第一行将包含查询数量q。下一行q
行将包含两个空格分隔的整数,其中包含n和l。
输出:对于每个查询,打印一行包含
函数f(n,l)。答案可能太大,所以按模数打印
十亿零七
约束条件:1<=Q<=10^3 1<=N<=26 1<=L<=10^9
语句:给定两个整数n和l,其中n表示
字符和L表示字符串的长度。
我的解决方法是:
有两种可能的用例:
1.)L<=N如果字符串L的长度小于或等于N,则在每个位置我们可以选择N-1个字符,因此字符串总数将为(N-1)^L
2.)l>n如果字符串l的长度大于n,则可能的字符串数为:(n-1)^n*n^(l-n)对于剩余的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--;
}
}
最佳答案
虫子是什么?
你在做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)
,所以你可以解决这个问题!