hdu1133 Buy the Ticket (卡蘭特數應用+java大數)
阿新 • • 發佈:2017-07-13
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大數)