

注解
1、此题是Catalan数的变形,如果m=n,则就是标准的卡塔兰数。
2、如果m<n,直接输出0。
3、对于m>n的情况,要转换成排列。化简后的公式为:F(N) =(m+n)!*(m-n+1)/(m+1)
4、必须用大数来解决。
代码
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = 0;
int n = 0;
int cas = 1;
while(sc.hasNext()) {
m = sc.nextInt();
n = sc.nextInt();
BigInteger ans = BigInteger.valueOf(m-n+1);
if(m==0 && n==0) {
break;
}
else if(m<n) {
ans = BigInteger.ZERO;
}
else {
BigInteger tmp = BigInteger.ONE;
for(int i=1; i<=m+n; i++) {
tmp = tmp.multiply(BigInteger.valueOf(i));
}
ans = ans.multiply(tmp);
ans = ans.divide(BigInteger.valueOf(m+1));
}
System.out.println("Test #" + cas + ":");
System.out.println(ans);
cas++;
}
sc.close();
}
}
结果

本文探讨了Catalan数的一种变形算法,当m大于n时,通过转换成排列问题并使用大数处理,提供了详细的代码实现。
485

被折叠的 条评论
为什么被折叠?



