1. 程式人生 > >洛谷P4260:[Code+#3]博弈論與概率統計 (組合數學+莫隊/分塊)

洛谷P4260:[Code+#3]博弈論與概率統計 (組合數學+莫隊/分塊)

題目分析:一道很好的題,既不是無腦的演算法套路題,也不是單純的推式子題。因此我講得詳細一些。比賽的時候我因為時間問題沒有看這題,後來補了題面,花了一節數學課自己推出了一些東西(O(Tn)的做法)。後來看了官方題解,發現了一種關於組合數字首和的新姿勢QAQ。

首先,題面給你的p是沒用的,就是用來混淆視聽。我們只需要算出所有方案的得分之和,最後再除以Cn+mn即可。接下來我們想知道,對於每一個k(k[nm,n]),最終得分為k的方案數是多少?

不妨假設mn。首先考慮k=nm的方案數,換句話說就是Alice得分序列的字首和都為非負的方案數。這是一個經典的類似Catalan數的問題。我們可以把Alice的得分序列轉化成平面上從(0,0)到(n,m)的一條路徑,橫著走一步代表出現了一個1,豎著走代表-1:

那麼,不碰到y=x+1這條直線的路徑就是合法的方案(藍色路徑),我們可以用總方案數Cn+mn減去不合法的方案數求得。對於一條不合法的路徑(綠色路徑),我們找出它第一次碰到y=x+1的位置,然後翻轉前面的這段路徑(粉色路徑),它就變成了一條從(-1,1)到(n,m)的路徑。可以證明不合法的方案翻轉後都能一一對應這樣的路徑,所以合法的方案數為Cn+mnCn+mn+1

那麼如果k=nm+1呢?我們發現,假設Alice得分序列的字首和最小值為-1,那麼她在第一次出現-1的時候,得分會變成0,所以後面的-1就會變為0分,這樣最終得分就是n-m+1。換句話說,我們要求的就是碰到了y=x+1,但沒碰到y=x+2的路徑條數。由類似上面的方法可得,其值為

Cn+mn+1Cn+mn+2

於是我們推出了最終答案的式子:

ans=i=0m(Cn+mn+iCn+mn+i+1)(nm+i)

通過錯位相減和一些轉換,我們發現:

ans=(nm)Cn+mn+i=0m1Cn+mi

同理,當n<m時:

ans=i=0n1Cn+mi

預處理階乘和其逆元之後,求組合數就是O(1)的。現在的問題變成了如何快速求這個東西:

F(n,k)=i=0kCni

根據楊輝三角Cij=Ci1j1+Ci1j,我們可以推出:

F(n+1,k)=2F(n,k)Cnk

那麼求F(n,k)就相當於詢問平面上點(n,k)處的值,而我們可以用O(1)的時間移動到某個已知點的相鄰點。這是個經典的問題,可以用分塊或者莫隊解決。雖然它們都是