题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133
题目意思,n个人拿50元,m个人拿100元,买票不停止的排队序列。
这个和介绍卡特兰数的例子时候差不多--->猛戳http://blog.csdn.net/u011394362/article/details/40677533。
只是,这个问题变为了n个人拿50元,m个人拿100元。所以算是小小的变形了吧?好吧,这个型变的比较小。。
分析:
我们好是按0,1序列来进行分析。总共的排列方式为C(n + m, n)。那么我们也可以就算出非法序列的种数,也就是n个1和m个0的Sigma序列。。C(n + m, n - 1)。
然后,我们知道每个人都是不同的,排列m! * n!。
ans = ( C(n + m, n) - C(n + m, n - 1) ) * m! * n! =(n + m) ! * (m - n + 1) / (m + 1)。。
大数解决。。
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int m, n, k = 1;
while(in.hasNext()){
m = in.nextInt();
n = in.nextInt();
if(m == 0 && n == 0) break;
System.out.println("Test #" + k + ":"); k ++;
if(m < n){
System.out.println("0");
continue;
}
BigInteger ans = BigInteger.ONE;
for(int i = 1; i <= m + n; i ++){
ans = ans.multiply(BigInteger.valueOf(i));
}
ans = ans.multiply(BigInteger.valueOf(m - n + 1));
ans = ans.divide(BigInteger.valueOf(m + 1));
System.out.println(ans);
}
}
}
------>
Java大数类还是比较好用的。。。。