交錯排列型容斥
引例:\(n\) 種顏色的球分別 \(a_i\) 個,相鄰不同色,排列,方案數。
\(m=\sum a_i\le 10^5\)
首先考慮題目中的限制條件是什么,對於單種顏色的球從左往右看,第 \(i\) 個跟第 \(i+1\) 個不相鄰,那么該顏色就對應着 \(a_i-1\) 個限制。
普通容斥,也就是枚舉打破多少限制
換成枚舉 \(c_i=a_i-b_i\),然后 \(c_i\) 的意義是說第 \(i\) 個顏色強制縮成這么多個段。
注意到可以按 \(\sum c_i\) 統計答案,那么構造關於后式的普通生成函數
用分治 ntt 卷積以后統計答案即可,復雜度 \(O(m\log^2m)\)。
當然這個是帶標號球的拼接,顯然可以直接用指數生成函數來理解,本質是一樣的。
2018 集訓隊作業 - 青春豬頭少年不會夢到兔女郎學姐
給定 \(n\) 種顏色的球,第 \(i\) 種顏色的球數量為 \(r_i\) ,對於一種排列方式,貢獻可以如下計算:先把這個序列首尾相連,然后把所有相鄰且顏色相同的段拿出來,貢獻為他們的長度之積,求所有貢獻和。
\((1,2,1,2)\) 和 \((2,1,2,1)\) 貢獻相同但排列方式不同,要分別計算。
\(\sum r_i\le 10^5\)
提交地址:全網沒有。
此題極為毒瘤,必須要一步一步做,我們首先考慮不成環的情況。
Step 1
枚舉把顏色 \(i\) 切成 \(b_i\) 段,設 \(f(x,y)\) 表示 \(x\) 有序的切成 \(y\) 段的所有方案、每段長度乘積之和。
問題轉換為交錯排列,直接套用上題的式子,那么有:
把 \(c_i\) 整到前面來得到
那么維護生成函數
Step 2
考慮算這個 \(F_i(x)\) 有 \(f(x,y)={x+y-1\choose y-1}\) ,可以結合組合意義理解,那么也可以推卷積計算了。
Step 3
分治 ntt 計算卷積,復雜度 \(O(m\log^2 m)\)。
Step 4
要做環上的情況,我們欽定顏色 1 在序列最前頭並且結尾不是 1,那么用開頭是 1 的 - 開頭結尾都是 1 的。
(欽定 \(t\) 個位置為 1 相當於把 \(F_1(x)\) 多項式往左平移 \(t\) 位。)
這樣的一種方案,我們可以通過任意旋轉的方式遍歷所有可行方案,那么我們最終把答案乘以 \(m=\sum r_i\) 即可。
Step 5
然后你發現這樣會算重,具體的,一個方案有 \(j\) 段顏色 1,會被每個 1 遍歷一遍,所以算重 \(j\) 遍,那么可以在顏色 1 的生成函數中帶上 \(1\over j\) 的系數來抵消掉,問題才最終解決。
另外一種未知原理的方法
考慮計算關於序列的生成函數 \(f(x)\), 則 \(ans=m\sum_{j=1}^m (j-1)![x^j]f(j)\)。
如果有知道為什么上式成立的大佬可以在下面評論,博主不勝感激。
