1. 程式人生 > >HNOI2017 拋硬幣 (FakeBeng)

HNOI2017 拋硬幣 (FakeBeng)

除了隊長快跑外最難的題吧。

除了需要寫\(exLucas\)之外,還教會了我大量的卡常技巧。

首先\(70\)分就是個直接按題意模擬,易得\(ans=\sum_{j=0}^{b} C_{b}^{j}\sum_{i=j+1}^{a}C_{a}^{i}\),把後面的求和用字尾和優化一下,外加\(exLucas\)和大力卡常應該可以拿到這檔分。

考慮滿分做法,首先對於\(a=b\)的,顯然每一種勝利局面取反後一定是一種失敗局面,當然還有平局。

我們考慮用總情況減去平局除以二。

如何計算平局,顯然有\(sum=\sum_{i=0}^{a}C_{a}^{i}*C_{b}^{i}\),因為\(a=b\)

,所以這式子等於\(C_{2a}^{a}\),證明很顯然。

所以當\(a=b\)時,\(ans=\frac{2^{a+b}-C_{2a}^{a}}{2}\)

現在考慮\(a>b\)的情況,顯然每個失敗狀態和平局取反後一定是必勝的,但是有些勝利狀態取反後還是勝利的。我們考慮計算這一部分。

我們假設小\(A\)拋了\(W_A\)次正面,小\(B\)拋了\(W_B\)次正面,那麼在該情況下有\(W_A>W_B\),那麼\(a-W_A>b-W_B\),得\(a-b>W_A-W_b>0\),列舉\(W_A-W_B\),有\(\sum_{i=1}^{a-b-1}\sum_{j=0}^{b}C_{b}^{j}C_{a}^{i+j}\)

,轉換一下得\(\sum_{i=1}^{a-b-1}\sum_{j=0}^{b}C_{b}^{b-j}C_{a}^{i+j}\) ,因為\(b-j+i+j=b+i\),所以\(\sum_{i=1}^{a-b-1}C_{a+b}^{b+i}\),然後就可以算了。\(ans=\frac{2^{a+b}+\sum_{i=1}^{a-b-1}C_{a+b}^{b+i}}{2}\) 。然後你就可以算了,還有個卡常,就是這個組合數是對稱的,我們可以只算一半。