加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

hdu 1133(大数——Buy the Ticket)

发布时间:2020-12-14 04:02:09 所属栏目:大数据 来源:网络整理
导读:题目大意:输入拥有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) 推導

题目大意:输入拥有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個人拿50n個人拿100

1、如果n?>?m,那麼排序方法數為0,這一點很容易想清楚

2、現在我們假設拿50的人用0表示,拿100的人用1表示。

如果有這麼一個序列0101101001001111

當第K個位置出現1的個數多餘0的個數時就是一個不合法的序列了

假設m=4,n=3的一個序列是:0110100?。顯然,它不合法,現在我們把它稍微變化一下:

把第二個1(這個1前面的都是合法的)後面的所有位0變成11變成0.

就得到0111011這個序列1的數量多餘0的數量,顯然不合法,但現在的關鍵不是看這個序列是不是合法的

關鍵是:他和我們的不合法序列0110100成一一對應的關係。

也就是說任意一個不合法序列(m0n1),都可以由另外一個序列(n-10m+11)得到。

另外我們知道,一个序列要麼是合法的,要麼是不合法的

所以,合法序列數量?=?序列總數量?-?不合法序列的總量

序列總數可以這樣計算?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)


推廣:

如果原來有p50元的話,那麼不合法的序列的數量應該是:任意一個不合法序列(m0n1),都可以由另外一個序列(n-10m+1+p1)得到,所以是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);
			}
			
			
		}
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读