HDU 1133 Buy the Ticket 卡特兰数 JAVA

题意:一行人排队买票,一张票50元,有m个持有50面值钞票的人,有n个持有100面值钞票的人。问,有多少种方案能够让窗口可以让前面人的钱把后面人的钱找开来,也就是说持有50面值钞票的人要尽量放在100面值钞票的人的前面。
思路:持有50面值钞票的人要尽量放在100面值钞票的人的前面。这是一个卡特兰数的模型了。另外因为每个人是不同的,所有结果要乘上 n! m! ,因为结果比较大,我就偷懒选了 java 来写。

http://acm.hdu.edu.cn/showproblem.php?pid=1133

/*********************************************
    Problem : HDU 1133
    Author  : NMfloat
    InkTime (c) NM . All Rights Reserved .
********************************************/

import java.io.*;
import java.math.*;
import java.util.*;

public class Main {
    public static void main(String argv[]) {
        Scanner cin = new Scanner(System.in);
        BigInteger [] F = new BigInteger[105];
        BigInteger [][] f = new BigInteger[105][105]; 
        for(int i = 0 ; i <= 100 ; i ++) for(int j = 0 ; j <= 100 ; j ++) {
            if(j == 0) f[i][j] = BigInteger.ONE;
            else f[i][j] = BigInteger.ZERO;
        }
        F[0] = BigInteger.ONE;
        for(int i = 1 ; i <= 100 ; i++) F[i] = F[i-1].multiply(BigInteger.valueOf(i));
        for(int i = 1 ; i <= 100 ; i ++) { 
            for(int j = 1 ; j <= i ; j ++) {
                f[i][j] = f[i-1][j].add(f[i][j-1]);
            }
        }
        int n , m;
        int CASE = 1;
        while(cin.hasNext()) {
            n = cin.nextInt();
            m = cin.nextInt();
            if(n == 0 && m == 0) break;
            System.out.printf("Test #%d:\r\n",CASE++);
            System.out.println(f[n][m].multiply(F[n]).multiply(F[m]));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值