hdu 1133(大数——Buy the Ticket)
来源:互联网 发布:携程亲子园虐童 知乎 编辑:程序博客网 时间:2024/05/18 03:35
题目大意:输入拥有50元的人数m和100元的人数n,求存在多少种情况使得能让这(n+m)个人都能顺利买到票(当存在100元的人买票时没钱找的话,即不成功)
解题思路:
解题思路(转):( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化简即 (m+n)! * (m-n+1) /(m+1)
推導過程如下:m個人拿50,n個人拿100
1、如果n > m,那麼排序方法數為0,這一點很容易想清楚
2、現在我們假設拿50的人用‘0’表示,拿100的人用‘1’表示。
如果有這麼一個序列0101101001001111。
當第K個位置出現1的個數多餘0的個數時就是一個不合法的序列了
假設m=4,n=3的一個序列是:0110100 。顯然,它不合法,現在我們把它稍微變化一下:
把第二個1(這個1前面的都是合法的)後面的所有位0變成1,1變成0.
就得到0111011這個序列1的數量多餘0的數量,顯然不合法,但現在的關鍵不是看這個序列是不是合法的
關鍵是:他和我們的不合法序列0110100成一一對應的關係。
也就是說任意一個不合法序列(m個0,n個1),都可以由另外一個序列(n-1個0和m+1個1)得到。
另外我們知道,一个序列要麼是合法的,要麼是不合法的
所以,合法序列數量 = 序列總數量 - 不合法序列的總量
序列總數可以這樣計算 m+n個位置中,選擇n個位置出來填上1,所以是C(m+n,n).
不合法序列的數量就是: m+n個位置中,選擇m+1個位置出來填上1,所以是C(m+n,m+1).
然後每個人都是不一樣的,所以需要全排列m! * n!.
所以最後的公式為:( C(m+n,n) - C(m+n,m+1) ) * m! * n!
化簡即為:(m+n)!*(m-n+1)/(m+1)
推廣:
如果原來有p張50元的話,那麼不合法的序列的數量應該是:任意一個不合法序列(m個0,n個1),都可以由另外一個序列(n-1個0和m+1+p個1)得到,所以是m+n個位置中,選擇m+1+p個位置,出來填上1所以是C(m+n,m+1+p),接下來簡化就不推了
package com.njupt.bigInteger;import java.math.BigInteger;import java.util.Scanner;public class HDU_1133_1 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);BigInteger m,n,c;BigInteger one = new BigInteger("1");int count = 1;while(scanner.hasNextInt()){c = one;int a = scanner.nextInt();int b = scanner.nextInt();if( a == 0 && b == 0){break;}else if( a < b){//一定要对这种情况进行处理,因为以下公式只是适用于a >= b的情况System.out.println("Test #"+count+++":");System.out.println("0");}else{int sum = a +b;m = new BigInteger(String.valueOf(a));n = new BigInteger(String.valueOf(b));for(int i = 1; i <= sum ; ++i){c = c.multiply(new BigInteger(String.valueOf(i)));}c = c.multiply(m.add(one).subtract(n)).divide(m.add(one));System.out.println("Test #"+count+++":");System.out.println(c);}}}}
- hdu 1133(大数——Buy the Ticket)
- HDU 1133 Buy the Ticket DP+java大数
- hdu 1133 Buy the Ticket
- buy the ticket hdu 1133
- 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
- hdu 1133 Buy the Ticket
- hdu 1133 Buy the Ticket
- HDU 1133 Buy the Ticket
- HDU 1133 Buy the Ticket
- HDU Buy the Ticket
- Buy the Ticket HDU
- HDU Buy the Ticket
- HDU Buy the Ticket(大数除法乘法要注意)
- 编程技术面试的五大要点
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- UITableView 设置背景图片
- html 简单入门
- uva 10706 Number Sequence
- hdu 1133(大数——Buy the Ticket)
- 程序员编程艺术第三十二~三十三章:最小操作数,木块砌墙问题
- 理解 Linux 的硬链接与软链接
- 动态监控网卡流量异常
- (Jquery功能篇) JqGrid表单控件实例代码
- 【pig】pig的vim高亮设置
- Android之解决Mediaplayer播放网络音频缓冲太慢的问题
- EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)
- html入门之—一天快速掌握