(容易觀察得到,本文的公式都是直接從題解裏面抄過來的。)
代碼咕了,所以不從題解裏面抄過來的內容全部不保證正確。
Easy Version
觀察樣例,發現對於 \(1\le n\le 3\) ,合法序列個數恰好是 \(n!\) ,所以猜想合法序列能和排列一一對應。
我的想法:
對於一個合法序列,從最大值的最左邊出現位置 \(x\) 開始跳。如果 \(x\) 不是 \(a_x\) 的最右邊出現位置那麼往下一個位置跳(往右),否則往 \(a_x-1\) 的左端點跳(往左)。特別地, 1 的右端點往 \(mx\) 的左端點跳(任意)。這樣可以構造出一個環,我們令起始點是 \(mx\) 的左端點,即可得到方案數 \(n!\) 。
從一個環+一個起始點對應回去也是類似的。
環+點怎麼變成排列呢?那就是任取一個排列,連邊 \(p_i\to p_{i+1}\) ,並令 \(p_1\) 是起始點即可。
現在就很好看了。對於一個排列,從 \(p_1\) 開始,分成若干個極長連續上升子段,那麼每一段都是相同的,並且段之間單調遞減。
由於這東西是很對稱的,所以爲了與題解統一,變成:分成若干個極長連續下降子段,每個位置對應的值是前面的小於號的個數。
對於一個值的出現次數,容易想到要考慮每個位置的貢獻,所以要求出所有 \(f_{i,j}\) 表示 \(i\) 個數中恰好有 \(j\) 個小於號的方案數。
顯然可以容斥。設 \(g_{i,j}\) 表示 \(i\) 個數“至少”有 \(j\) 個小於號的方案數(欽定 \(j\) 個小於號,其他隨便擺),有 \(g_{i,j}=S(i,i-j)\times (i-j)!=i![z^i](e^z-1)^{i-j}\) 。然後有 \(f_{i,j}=\sum_k {k\choose j}(-1)^{k-j}g_{i,k}\) 。
注意這裏如果選擇欽定 \(i-j-1\) 個大於號,那麼容斥係數會變成 \({i-j-1 \choose i-k-1}(-1)^{i-k-1}\) ,會非常醜陋,甚至會使得下面推不出一個好看的形式。
此時我們有
注意到最後一個求和符與 \(k\) 無關,所以只要能預處理出後面,就可以在 \(O(n^2)\) 或 \(O(n\log n)\) 的時間內得到答案。暴力預處理也是 \(O(n^2)\) 的。
Hard Version
設 \(F={e^z-1\over z}\) ,再化簡成
前者可以直接求出來,所以真正要求的就是 \([z^j]{F^{n-j+1}\over 1-F}\) 。這東西恰好是
設 \(w(z)=zF(z)\) , \(\phi(z)\) 滿足 \({w(z)\over \phi(w(z))}=z\) (即 \(\phi(z)={z\over w^{-1}}\) ),即 \({zF(z)\over \phi(w(z))}=z\) ,即 \(F(z)=\phi(w)\) 。
所以現在要求
(爲什麼要引入 \(\phi\) 呢?這樣可以使得所有 \(z\) 外面都包着一個 \(w\) ,方便反演。)
反演,把 \(w\) 搞掉,得到
其中求導是對 \(z\) 求偏導。
暴力把求導展開,得到
現在把 \({u\over (1-uz)^2}\) 和 \({1\over 1-uz}\) 拆掉,經過推導得到
我們知道 \(w=e^z-1\) ,所以 \(\phi(z)={z\over \ln(z+1)}\) ,然後就只需要抄板子了。
something more
兩種容斥方法,竟然無法推到同一個結果(或者是推導的難度不太一樣),非常離譜。
恆等式: