1. 程式人生 > >集訓隊作業2018: 青春豬頭少年不會夢到兔女郎學姐(多限制容斥)

集訓隊作業2018: 青春豬頭少年不會夢到兔女郎學姐(多限制容斥)

前言:
雖然這道題的名字有點那啥,但是題還是很好的,聽說是某道原題的加強版。

題意:
給定 n n 種顏色的球,第 i i 種顏色的球數量為 A

i A_i 個,保證 i = 1 n
A i 2 1 0 5
\sum_{i=1}^n A_i \le 2*10^5
,對於這所有 ( A i ) ! A i ! \frac{(\sum_{A_i})!}{\prod A_i!} 的排列,一種排列的貢獻可以如下計算:先把這個序列首尾相連,然後把所有相鄰且顏色相同的段拿出來,貢獻為他們的長度之積,求所有貢獻和。

題解:
這道題一開始就想偏到列舉迴圈節去了,看了題解才知道可以用容斥來算。

首先考慮算貢獻時首尾不相連怎麼做,這個時候我們可以列舉 a i a_i 被分為了 b i b_i 段,設其代價和為 f ( a i , b i ) f(a_i,b_i) ,那麼貢獻為 f ( a i , b i ) ways \prod f(a_i,b_i)*\text{ways} ways \text{ways} 表示所有 b i b_i 個段拼起來相鄰不同的方案數。

這個其實可以用多個顏色來一起容斥,我們再列舉一下最後每種顏色有幾個斷點被合併了,可以得到:
ways = c ( ( b i 1 c i ) ( 1 ) c i ) ( b i c i ) ! ( ( b i c i ) ! ) \text{ways} = \sum_c (\prod\binom{b_i-1}{c_i}(-1)^{c_i}) \frac{(\sum b_i-c_i)!}{\prod((b_i-c_i)!)}

然後其實就是要算這個玩意兒:
b c ( f a i , b i ( b i 1 c i 1 ) ( 1 ) b i c i ) ( c i ) ! c i ! \sum_b\sum_c (\prod f_{a_i,b_i} \binom{b_i-1}{c_i-1}(-1)^{b_i-c_i})\frac{(\sum c_i)!}{\prod c_i!}

我們可以考慮把每個顏色球關於 c c 的egf搞出來,相當於是對每個 c c ,求:
b c ( b 1 c 1 ) ( 1 ) b c f a , b \sum_{b\ge c} \binom{b-1}{c-1}(-1)^{b-c}f_{a,b}

然後分治FFT即可得到求答案的egf。

考慮一下 c c 的egf怎麼求,觀察一下這個 f ( a , b ) f(a,b) ,不難發現其等於 ( a + b 1 2 b 1 ) = ( a + b 1 a b ) \binom{a+b-1}{2*b-1} = \binom{a+b-1}{a-b} ,相當於先分成 b b 段,插 b 1 b-1 個板,然後每段選 1 1 個數,這樣兩個組合數卷積也可以FFT優化一下。

然後考慮一個環怎麼做,我們強制規定這個序列從1開頭,不以1結尾就行了, c 1 c_1 的egf那個 c c 要變成 c 1 c-1 ,可以算出從1開頭的方案數, c 1 c_1 的egf的 c c 變成 c 2 c-2 可以算出以1開頭且以1結尾的方案數,減一下就可以得到以1開頭不以1結尾的方案數。

不過注意一下,這裡如果每 T T 個就出現迴圈的話,最後會計算 b m T \frac{b}{\frac{m}{T}}