1. 程式人生 > >hdu1133 Buy the Ticket (卡蘭特數應用+java大數)

hdu1133 Buy the Ticket (卡蘭特數應用+java大數)

targe integer pri () style 沒有 eof == title

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?

pid=1133

【題意】

電影票50塊一張

有m個人手裏正好有50塊,n個人手裏正好有100塊,售票廳開始沒有錢。問,有多少種排隊的方式,能夠讓每一個人都買上票。

(假設售票廳沒有50塊零錢,則持有100塊的人買不了票)

【分析】

顯然。當m<n的時候,有0種排列方式。

當m>=n的時候:

用0。代表手裏僅僅有50塊的人,1,代表手裏僅僅有100塊的。

則0110100 這樣的情況不能滿足條件(到第三個人就買不了)

我們把包含第三個人及他之前的人 翻轉 (1->0, 0->1)

1000100 出現了這個序列;

0110100 有 4個0,3個1 1000100 有5個0 ,2個1

每個不能滿足的情況都相應這樣一個序列 所以 不能滿足的條件的情況共同擁有

C(m+1,m+n);

我們計算公式就是:合法的排列方式=全部排列方式-非法排列方式

於是就有了F(N)=(技術分享-技術分享)*m!*n! ;


然後再化簡一下;

F(N) =(m+n)!

*(m-n+1)/(m+1)。

由於數據過大,所以用了JAVA大數來解決

【代碼】

import java.util.*;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
            int a,b;
            Scanner in=new Scanner(System.in);
            int cnt=0;
            while(in.hasNext()){
                cnt++;
                a=in.nextInt();
                b=in.nextInt();
                BigInteger ans=BigInteger.ONE;
                if(a==0&&b==0)break;
                if(a<b) ans=BigInteger.ZERO;
                else {
                    for(int i=1;i<=a+b;i++){
                        ans=ans.multiply(BigInteger.valueOf(i));
                    }
                    int mpl=(a-b+1);
                    int dvd=(a+1);
                    ans=ans.multiply(BigInteger.valueOf(mpl));
                    ans=ans.divide(BigInteger.valueOf(dvd));
                }
                System.out.println("Test #"+cnt+":");
                System.out.println(ans);
            }
        }
}



hdu1133 Buy the Ticket (卡蘭特數應用+java大數)