Hdu 1133 Buy the Ticket[卡特兰数小变形]

来源:互联网 发布:gfa交易算法gfajiaoyi 编辑:程序博客网 时间:2024/05/20 05:31

题目链接: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大数类还是比较好用的。。。。

0 0
原创粉丝点击