【BigInteger】 Buy the Ticket

传送门

题意

假设电影院只有一个售票处,而每张票的价格是 \(50\) 美元。购票队列由 \(m + n\) 人组成(\(m\) 人每人只有 \(50\) 美元的钞票,\(n\) 人每人只有 \(100\) 美元的钞票)。
现在,您的问题是要计算从第一人到最后一个人不会停止购买过程的排队方式的数量。
注意:最初,售票处没有钱。
当售票处没有 \(50\) 美元的钞票,但排队的第一人只有 \(100\) 美元的钞票时,将停止购买过程。

数据范围

\(1\leq n,m\leq 100\)

题解

卡特兰数字的推导,区别是 \(n>m\),并且每个 \(n\) 和 \(m\) 的内部的有顺序,

\[(C(n+m,n)-C(n+m,n+1)) \times m! \times n! \]

Code

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        int n,m;
        Scanner in=new Scanner(System.in);
        int cnt=0;
        while(in.hasNext()){
            cnt++;
            n=in.nextInt();
            m=in.nextInt();
            BigInteger ans=BigInteger.ONE;
            if(n==0&&m==0)break;
            if(n<m) ans=BigInteger.ZERO;
            else {
                    for(int i=1;i<=n+m;i++){
                        ans=ans.multiply(BigInteger.valueOf(i));
                    }
                int x=(n-m+1);
                int y=(n+1);
                ans=ans.multiply(BigInteger.valueOf(x));
                ans=ans.divide(BigInteger.valueOf(y));
            }
            System.out.println("Test #"+cnt+":");
            System.out.println(ans);
        }
    }
}
上一篇:Integer 数据类型就无能


下一篇:Java基础/新手入门之API(part04)___BigInteger类/BigDecimal类