【BigInteger】 Buy the Ticket
传送门
题意
假设电影院只有一个售票处,而每张票的价格是 \(50\) 美元。购票队列由 \(m + n\) 人组成(\(m\) 人每人只有 \(50\) 美元的钞票,\(n\) 人每人只有 \(100\) 美元的钞票)。
现在,您的问题是要计算从第一人到最后一个人不会停止购买过程的排队方式的数量。
注意:最初,售票处没有钱。
当售票处没有 \(50\) 美元的钞票,但排队的第一人只有 \(100\) 美元的钞票时,将停止购买过程。
求从所有人购票不中断的队列组合方式
数据范围
\(1\leq n,m\leq 100\)
题解
- \(m < n\) 时,会有中断所有人不能完成,所以为 0
- 卡特兰数字的推导,区别是 \(n\geq m\),每个 \(n\) 和 \(m\) 的内部有顺序,所以要额外乘\(n! \times 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);
}
}
}