Min-Max 容斥
一種關於 \(min,max\) 的容斥。
公式:
\(min(S),max(S)\) 分別表示 \(S\) 中的最大值和最小值。
證明:考慮列舉每個元素作為最小中的貢獻(如果有多個值相同的數再再按下標比較)
那麼小於當前元素的數不能選。假設有 \(k\) 個大於當前元素的數,則有式子:
也就是說只有最大值才會有 \(1\) 的貢獻。
這個式子在期望意義下依舊滿足,根據期望的線性性那麼有:
擴充套件式子:
證明類似,還是列舉每個元素作為最小元素所在的貢獻。
設當前元素 \(x\) 從大到小排名為 \(p\) ,\(p<k\) 時貢獻為 \(0\)。
否則列舉 \(T\) 的大小。
只有元素 \(x\) 恰好是第 \(k\) 大的時候才會有 \(1\) 的貢獻。
P3175 HAOI2015
板子題,使用形式二轉化為求集合 \(T\) 至少一個位置 \(1\) 的期望步數。
相當於求的是所有子集的乘積和,再套一個 \(\text{FMT}\) 板子即可。
P4707 重返現世
題目求得是第 \(k\) 小元素出現的期望時間,等價於求第 \(n+1-k\) 大元素出現的期望時間。接下所有的 \(k\) 都是轉化後的。
使用形式三轉化為求集合 \(T\) 中出現第一個元素的期望時間,根據期望的線性性,轉步數為: \(\displaystyle\sum_{w\in T}\dfrac{1}{p_w}\),那麼有:
自然想到一個一個加物品。這種容斥式子的一個經典最佳化方式是直接將一部分記錄為權值,把不好轉移的放下標上。注意到有一個性知識
設 \(f_{i,j,k}\) 表示前 \(i\) 個數中選的所有數的 \(p_w=j\),第 \(k\) 大值的 \(\binom{|T|-1}{k-1}(-1)^{|T|-k}\) 的和是多少。
如果不選當前的數有轉移 \(f_{i,j,k}=f_{i-1,j,k}\)。
否則選的話,會出現新的係數,比較難處理,考慮:
你會發現前面一坨的係數等於 \(f_{i-1,j-p_i,k}\) 記錄的,後面一坨的係數等於 \(f_{i-1,j-p_i,k-1}\) 的,那麼有:
滾動陣列最佳化即可。
[AGC038E] Gachapon
感覺這題出得非常好啊!改變了對 \(min,max\) 的刻板影響。
重新定義 \(min(S)\) 表示集合中第一個滿足出現次數 \(c_i >b_i\) 的時間,\(max(S)\) 表示最後一個,設 \(suma\) 為 \(a\) 的總和。
那麼依舊可以套用形式二將本題轉化為求第集合 \(T\) 中第一個滿足條件的期望時間。
首先排除掉集合外元素的干擾,即期望下每 \(suma\displaystyle\sum_{w\in T}\dfrac{1}{a_w}\) 次才會選到一個集合內的元素。
然後注意到從集合內元素出現次數從 \({0,0,\cdots 0}\) 到恰好有一個數滿足 \(c_i=b_i\) 的過程中一共經過了 \(\displaystyle\sum_{w\in T}c_w\) 個狀態(最終狀態不算),那在中間的每個狀態做一的貢獻。那麼也就轉化為對於每個 \(\forall i\in T,c_i<b_i\) 的狀態,經過這裡的機率。
期望轉奇數,那麼對於一個固定狀態 \(c\),機率為:
第一項為多重排列數,第二項表示生成 \(c_i\) 個 \(i\) 的機率。
再把反演公式帶入:
跟上面類似,將一些更多的係數記錄在權值上。
設 \(f_{i,j,k}\) 表示前 \(i\) 個數選了若干個數使得 \(\sum a_i=j\) 且 \(\sum c_i=k\) 的 \((-1)^{|T-1|}\prod \dfrac{a_i^{c_i}}{c_i!}\)
的係數和。
轉移依舊分兩種,不選的話 \(f_{i,j,k}=f_{i-1,j,k}\)
選的話 \(f_{i,j,k}=-f_{i-1,j-a_i,k-c_i}\times \prod\dfrac{a_i^{c_i}}{c_i!}\)。
複雜度看起來是 \(O(n^4)\) 的,(預設 \(\sum a_i,\sum b_i,n\) 同階),狀態三維轉移需要列舉 \(c_i\)。
但是仔細一想 \(c_i\) 的一共的列舉量是 \(\sum b_i\) 的,攤下來就是 \(O(n^3)\) 的!
P5643 PKUWC2018 隨機遊走
依舊可以適用形式二將轉化為走到集合第一次走到 \(T\) 任意一個元素的期望時間。
讓出發點為樹的根節點,設 \(f_i\) 表示從 \(i\) 節點出發走到 \(T\) 的期望步數。
設 \(d_i\) 表示 \(i\) 的度數,那麼有:
顯然 \(i\in T\) 的步數為 \(0\)。
那麼可以直接高斯消元得到 \(f\) 的真實值,但是複雜度略有些爆,可能需要卡常。
注意到這題其實性質非常好,如果 \(f\) 的值只和兒子有關的話那麼就可以遞推了。唯一的為題就是 \(fa\) 的貢獻,那麼考慮設 \(f_i\) 用 \(k_if_{fa}+b_i\) 表示。
那麼有:
現在轉移就跟父親節點無關了,一遍 \(\text{DFS}\) 即可求出所有值。
現在我們對於每個集合 \(T\) 都可以 \(O(n)\) 求出 \(f_{rt}\) 的值。
注意到:
我們處理出 \((-1)^{|T|+1}E(\min(T))\) 即可。
剩下的只剩下高位字首和即可。
P3600 隨機數生成器
還是更改 \(\min,\max\) 的定義。
\(min(S)\) 表示每次詢問的答案的最小值,\(\max(S)\) 表示最大值。
套用形式二:
集合 \(T\) 的答案顯然只和所包含的本質不同的位置個數(區間並)有關。
機率轉計數,設 \(f_{i,j}\) 表示 \(i\) 個數中最小值為 \(j\) 的方案數,\(sf_{i,j}\) 表示前 \(i\) 個數中最小值大於等於 \(j\) 的方案數,\(F_i\) 表示區間並大小為 \(i\) 的期望。
首先如果一個區間包含另一個區間是沒有任何作用的。(如果一個大的區間被選擇了,那麼小區間選和不選分別帶來 \(1\) 和 \(-1\) 的代價,抵消了)。那把所有包含另一個區間的區間給消除掉。再按照右端點排序。
直接記錄區間並略有些麻煩,考慮記補集大小,再設 \(g_{i,j,0/1}\) 表示前 \(i\) 個區間選了若干個區間使得區間並的 補集 是 \(j\) 且選了奇數/偶數個區間。
注意到 \(l,r\) 分別單調遞增,兩坨式子分別考慮,第一坨考慮對於每個 \(g_{p,j,w}\) 在 \(r_p<l_i\) 的時候再加入貢獻,貢獻到 \(c_{j+r_p,w}\),第二託式子考慮對於每個 \(g_{p,j,w}\) 在算出的時候就貢獻到 \(d_{j,w}\),在 \(r_p<l_i\) 的時候取消貢獻即可。
那麼有:
最後再把貢獻帶入:
Become Big For Me
一道擴充套件 \(\min-\max\) 容斥題,真的很牛牛。
令 \(V_p(n)\) 表示最大的 \(k\),滿足 \(p^k\mid n\)。
對於所有質因子 \(p\),設 \(v_p(a_i)\) 中的最小值和次小值(不要求嚴格)為 \(x_p,y_p\),那麼答案為 \(\displaystyle\prod_p p^{x_p+y_p}\),注意到操作都是跟 \(\text{lcm}\) 有關,也就是跟 \(v_p(a_i)\) 的最大值有關。套上 \(\min-\max\) 容斥有:
這個其實應該是先對每個因子做 \(min-max\) 容斥,然後再相乘。
有一個金典的結論為我們任意一個值域為 \([1,10^6]\) 的集合 \(S\),都存在一個大小為至多為 \(7\) 的子集 \(T\) 使得 \(\gcd(T)=\gcd(S)\)。
構造則可以任選一個數,將其最小冪次對應的數加入集合,再檢查這個數能否去除即可,證明見 \(CF\) 官方題解。
我們這樣選出兩組數,使得答案不變,使用的子序列總長度約為 \(O(2^k\times k^2)\),其中 \(2^k\times k\) 為操作次數,其中帶一個 \(\dfrac{1}{4}\) 的常數,足以透過。