hdu 1133 Buy the Ticket(Catalan数)
2014-08-09 11:41
351 查看
题意:有m个人,每人只有一张50元,还有n个人,每人只有一张100元,这些人排队买50元的电影票。售票处一开始没有钱,问要让这m+n个人全部顺利买票的排队方法有多少种。
分析:把只有50元的人记为0,把只有100元的人记为1,问题等价于,m个0,n个1组成的序列中,由左向右累计,在任意一个位置的0的累计数都不少于1的累计数的序列有多少排列方式,结果再乘以m!n!(因为每个人都是不同的)。
这道题有一个巧妙的解法:
n=0时,答案显然是m!
m<n时,答案是0
现在讨论m>=n的情况。
m=6,n=6时,一个非法的序列例如,001101100011(6个0,6个1),把第一个使序列非法的1右面的每个位翻转,即变成001101111100(5个0,7个1),可以看出每个非法的序列(6个0,6个1)都对应一个5个0,7个1的序列。
可以证明m个0,n个1的任意一个非法序列的翻转结果都是n-1个0,m+1个1的序列,而且前者跟后者是一一对应关系。因此,当我们知道n-1个0,m+1个1的序列的排列总数也就知道我们想求的序列的非法数。
所以我们计算公式就是:合法的排列方式=所有排列方式-非法排列方式
我们这里非法排列方式的计算 就是:(
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/a69ad02da4a2443dd459b77e0ce625336406f38c.png)
-
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/d0fba279bc8bd7c9962b22e6845d10bc79d3bd11.png)
)*M!*N!,然而在这题,因为每个人都是不同的,所以还要乘以
M!*N!
所以得出最终方程:
F(N)=(
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/a69ad02da4a2443dd459b77e0ce625336406f38c.png)
-
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/d0fba279bc8bd7c9962b22e6845d10bc79d3bd11.png)
)*M!*N!
;
然后再化简一下;
F(N)=(M+N)! * (M-N+1)/(M+1)
分析:把只有50元的人记为0,把只有100元的人记为1,问题等价于,m个0,n个1组成的序列中,由左向右累计,在任意一个位置的0的累计数都不少于1的累计数的序列有多少排列方式,结果再乘以m!n!(因为每个人都是不同的)。
这道题有一个巧妙的解法:
n=0时,答案显然是m!
m<n时,答案是0
现在讨论m>=n的情况。
m=6,n=6时,一个非法的序列例如,001101100011(6个0,6个1),把第一个使序列非法的1右面的每个位翻转,即变成001101111100(5个0,7个1),可以看出每个非法的序列(6个0,6个1)都对应一个5个0,7个1的序列。
可以证明m个0,n个1的任意一个非法序列的翻转结果都是n-1个0,m+1个1的序列,而且前者跟后者是一一对应关系。因此,当我们知道n-1个0,m+1个1的序列的排列总数也就知道我们想求的序列的非法数。
所以我们计算公式就是:合法的排列方式=所有排列方式-非法排列方式
我们这里非法排列方式的计算 就是:(
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/a69ad02da4a2443dd459b77e0ce625336406f38c.png)
-
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/d0fba279bc8bd7c9962b22e6845d10bc79d3bd11.png)
)*M!*N!,然而在这题,因为每个人都是不同的,所以还要乘以
M!*N!
所以得出最终方程:
F(N)=(
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/a69ad02da4a2443dd459b77e0ce625336406f38c.png)
-
![](http://xuyemin520.is-programmer.com/user_files/xuyemin520/epics/d0fba279bc8bd7c9962b22e6845d10bc79d3bd11.png)
)*M!*N!
;
然后再化简一下;
F(N)=(M+N)! * (M-N+1)/(M+1)
import java.util.*; import java.math.BigInteger; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner In=new Scanner(System.in); int m,n,i,t; t=1; while(true){ m=In.nextInt(); n=In.nextInt(); if(m+n==0) break; System.out.println("Test #"+(t++)+":"); if(m<n){ System.out.println(0); continue; } BigInteger a=BigInteger.ONE; for(i=1;i<=n+m;i++){ a=a.multiply(BigInteger.valueOf(i)); } a=a.multiply(BigInteger.valueOf(m+1-n)).divide(BigInteger.valueOf(m+1)); System.out.println(a.toString()); } } }
相关文章推荐
- HDU-1133 Buy the Ticket (Catalan数)
- HDU 1133 Buy the ticket catalan 数
- HDU 1133 Buy the Ticket
- 【大数+DP】HDU 1133——Buy the tickets(不用catalan数了)
- hdu 1133 Buy the Ticket
- hdu 1133 Buy the Ticket 卡特兰数+递推+java
- HDOJ HDU 1133 Buy the Ticket ACM 1133 IN HDU
- HDU 1133 Buy the Ticket
- hdu 1133 Buy the Ticket(递推+精度精算)
- hdu 1133 Buy the Ticket
- HDU 1133 Buy the Ticket 卡特兰数
- hdu 1133 Buy the Ticket(卡特兰数 + 高精度)
- hdu 1133 Buy the Ticket (高精乘法,不需高精除法)
- Buy the Ticket&&http://acm.hdu.edu.cn/showproblem.php?pid=1133
- hdu 1133 Buy the Ticket
- HDU 1133 Buy the Ticket(DP)
- hdu 1133 Buy the Ticket
- HDU 1133 Buy the Ticket
- hdu 1133 Buy the Ticket
- buy the ticket hdu 1133