老年選手康復訓練


學考考完了。雖然身為d類咸魚選手還是要好好備戰一下noi的。

從今天開始進行康復訓練,不過白天應該還是要肝文化課。等過幾天訓練時間應該會多一點。

[CTS2019]隨機立方體

這道題現在做了一遍好像有一點sibo啊,可能是考試的時候太緊張了吧。

題意就不寫了。

題目要求恰好\(k\)個,那我們考慮用至少含\(i\)個進行容斥。

那么容斥系數\(f_i\)需要滿足:

\[[i=k]=\sum_{j=0}^i{i\choose j}f_j \]

進行二項式反演,得到:

\[f_i=\sum_{j=0}^i(-1)^{i-j}{i\choose j}[j=k] \]

即:

\[f_i=(-1)^{i-k}{i\choose k} \]

由於在\(i<k\)\({i\choose k}\)等於\(0\),因此上面的式子是良定義的。

那么考慮如何計算至少含\(i\)個極大數的概率。

首先極大數的行號、列號、bule號(bule代表第三維的名稱)一定不是相同的。

比較關鍵的一點是,我們可以注意到任何欽點\(i\)個兩兩坐標全不同的格子為極大數的概率都是相同的。於是我們可以找一個比較特殊的位置計數,比如讓他們的坐標為\((1,1,1)\)\((2,2,2)\)\(\dots\)\((i,i,i)\)。同時我們欽點\(a_{1,1,1}<a_{2,2,2}<\dots<a_{i,i,i}\)

思考一下,可以發現如果我們只觀察至少有一維橫坐標\(\leq i\)的格子,\((i,i,i)\)一定是其中的最大值。如果我們只觀察至少有一維橫坐標\(\leq i-1\)的格子,\((i-1,i-1,i-1)\)一定是其中的最大值。以此類推即可。不難發現只要滿足上述條件,那么這個方案一定合法。

我們設\(a_i\)表示所有橫坐標至少有一維\(\leq i\)的格子數。那么滿足之前所述條件的概率就是:

\[\prod_{j=1}^i\frac{1}{a_j} \]

同時還要注意,這只是我們欽點的位置和大小關系之后的答案,所有合法的選取位置和大小關系的方案共有\({n\choose i}{m\choose i}{l\choose i}*(i!)^3\)種,其組合意義是分別選出三維的橫、縱、bule坐標,再決定大小關系。

后面的方案數可以用預處理階乘及逆元實現\(O(1)\)計算,之前的概率,則可以通過線性求逆元均攤\(O(1)\)計算。於是做一組數據就是\(O(n)\)的,總復雜度\(O(Tn)\)

[CTS2019]珍珠

\[F(x)=\sum_{i\geq 0}\frac{[i\bmod 2=1]}{i!}x^i=\sinh(x)=\frac{e^x-e^{-x}}{2} \]

\[G(x)=\sum_{i\geq 0}\frac{[i\bmod 2=0]}{i!}x^i=\cosh(x)=\frac{e^x+e^{-x}}{2} \]

\[Ans=\sum_{k=0}^{n-2m}{D\choose k}n![x^n]F^kG^{D-k} \]

用二項式定理把\(F^k\)\(G^{D-k}\)展開,可以得到:

\[Ans=\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^k\sum_{j=0}^{D-k}{D\choose k}(-1)^{k-i}{k\choose i}{D-k\choose j}(2(i+j)-D)^n \]

\[Ans=\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^k\sum_{j=0}^{D-k}\frac{D!(-1)^{k-i}(2(i+j)-D)^n}{(k-i)!i!(D-k-j)!j!} \]

\[Ans=\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^k\sum_{j=0}^{D-k}\frac{(2(i+j)-D)^nD!}{(i+j)!(D-(i+j))!}*\frac{(i+j)!}{i!j!}*\frac{(-1)^{k-i}(D-(i+j))!}{(k-i)!(D-k-j)!} \]

\[Ans=\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^k\sum_{j=0}^{D-k}(2(i+j)-D)^n{D\choose i+j}{i+j\choose i}(-1)^{k-i}{D-(i+j)\choose k-i} \]

\[Ans=\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i+j=0}^{D}(2(i+j)-D)^n{D\choose i+j}\sum_{i=0}^k{i+j\choose i}(-1)^{k-i}{D-(i+j)\choose k-i} \]

考慮\([x^i](1+x)^n={n\choose i}\)\([x^i](1-x)^n=(-1)^i{n\choose i}\)

因此$${i+j\choose i}=x^i^{i+j},(-1)^{k-i}{D-(i+j)\choose k-i}=x^{k-i}^{D-(i+j)}$$

\[\sum_{i=0}^k{i+j\choose i}(-1)^{k-i}{D-(i+j)\choose k-i}=\sum_{i=0}^k\Big([x^i](1+x)^{i+j}\Big)*\Big([x^{k-i}](1-x)^{D-(i+j)}\Big)=[x^k](1+x)^{i+j}(1-x)^{D-(i+j)} \]

\[Ans=\frac{1}{2^D}\sum_{k=0}^{n-2m}\sum_{i=0}^{D}(2i-D)^n{D\choose i}[x^k](1+x)^i(1-x)^{D-i} \]

\(a_i=\frac{(2i-D)^n{D\choose i}}{2^D}\)

\[Ans=\sum_{k=0}^{n-2m}\sum_{i=0}^{D}a_i[x^k](1+x)^i(1-x)^{D-i} \]

\[Ans=\sum_{k=0}^{n-2m}[x^k]\Big(\sum_{i=0}^{D}a_i(1+x)^i(1-x)^{D-i}\Big) \]

考慮先把\(\sum_{i=0}^Da_i(1+x)^i(1-x)^{D-i}\)算出來,最后一個個加。

至於這個,可以使用分治fft大法。

什么一個log,分治fft天下第一。

[CTS2019]氪金手游

現在想想怎么又比較簡單啊。

考慮把關系樹隨便欽點一個當根。

由於正向邊(向兒子連的邊,表示必須早於兒子)和反向邊同時存在,因此比較麻煩。考慮用容斥將反向邊變為正向邊,即:選出一個反向邊子集\(S\),強制這些邊必須被違反,其余反向邊隨意。注意正向邊是永遠需要滿足的。計算得這樣計算出的方案有\((-1)^{|S|}\)的貢獻。

對於一種選法,原樹用正向邊分成了若干聯通塊。對於一個點\(i\),設\(s_i\)表示是它的子樹中的點的集合。如果只考慮這棵子樹,我們顯然要滿足\(i\)是第一個被抽出來的,概率就是\(\frac{w_i}{\sum_{j\in s_i}w_j}\),接下來可以分成若干子樹遞歸。

那么若干種方案就可以合起來算概率了。我們設\(dp_{i,j}\)表示以\(i\)為根的子樹,當\((\sum_{k\in s_i}w_k)=j\)時,目前滿足所有條件的情況乘以他們的系數的概率和。轉移比較容易得到。

[ZJOI2019]開關

這真是一道好題,被送退役得心服口服。

先說幾個結論:

我們設\(\tilde f\)表示集合冪級數\(f\)在快速沃爾什變換(\(\text{FWT}\))后的形式。

那么:

\[[x^S]\tilde f=\sum_{T}(-1)^{|S\cap T|}[x^T]f \]

\(\text{FWT}\)的意義中可以看出。

\[\sum_{T}(-1)^{|S\cap T|}=2^n[S=\emptyset] \]

其中\(n\)代表全集的大小。這和子集容斥的原理是相似的。

\[\sum_{T}[x^T]\tilde f=2^n[x^{\emptyset}]f \]

用前一個式子不難證明。

現在說題目的解法。

根據題目描述,我們設\([x^S]f\)表示第一次到達狀態\(S\)的期望步數。為了分析方便,我們也可以將其看成是從狀態\(S\)到空集的期望步數。那么對於\(S\neq \emptyset\),我們就有:

\[[x^S]f=\Big(\sum_i\frac{p_i}{\sum_j p_j}[x^{S\Delta\{i\}}]f\Big)+1 \]

為了更方便的表達這個式子,我們設形式冪級數\(g\),其中當\(S=\{i\}\)時,\([x^S]g=\frac{p_i}{\sum_j p_j}\),否則\([x^S]g=0\)

於是上式可以表達為:

\[f=\Big(\sum_{T}x^T\Big)+fg+cx^{\emptyset} \]

其中\(c\)是某個不確定的系數,起到補償\(\emptyset\)不符合該式的作用。我們嘗試進行\(\text{FWT}\),對於\(\sum_{T}x^T\),它是\(x^{\emptyset}\)進行\(\text{FWT}\)后的結果,因此其\(\text{FWT}^{-1}\)的結果為\(x^{\emptyset}\),所以其\(\text{FWT}\)后的結果為\(2^nx^\emptyset\)。因此:

\[[x^S]\tilde f=2^n[S=\emptyset]+[x^S]\tilde f[x^S]\tilde g+c \]

\[(1-[x^S]\tilde g)[x^S]\tilde f=2^n[S=\emptyset]+c \]

考慮\([x^\emptyset]\tilde g=\sum_{i}\frac{p_i}{\sum_j p_j}=1\),因此將\(S=\emptyset\)代入上式可得\(c=-2^n\)

那么對於\(S\neq \emptyset\),就有:

\[[x^S]\tilde f=-\frac{2^n}{1-[x^S]\tilde g} \]

代入\(\text{FWT}^{-1}\)的式子中,我們就有:

\[[x^S]f=\frac{1}{2^n}\Big(\sum_{T}(-1)^{|S\cap T|}[x^T]\tilde f\Big)=\frac{[x^\emptyset]\tilde f}{2^n}-\Big(\sum_{T\neq \emptyset}(-1)^{|S\cap T|}\frac{1}{1-[x^T]\tilde g}\Big) \]

而由於\([x^\emptyset]f=0\),根據之前的結論,\(\sum_T[x^T]\tilde f=0\),所以\([x^\emptyset]\tilde f=-\Big(\sum_{T\neq \emptyset}[x^T]\tilde f\Big)=\sum_{T\neq \emptyset}\frac{2^n}{1-[x^T]\tilde g}\)

因此:

\[[x^S]f=\frac{1}{2^n}\Big(\sum_{T}(-1)^{|S\cap T|}[x^T]\tilde f\Big)=\Big(\sum_{T\neq \emptyset}\frac{1}{1-[x^T]\tilde g}\Big)-\Big(\sum_{T\neq \emptyset}(-1)^{|S\cap T|}\frac{1}{1-[x^T]\tilde g}\Big) \]

\[[x^S]f=\sum_{T\neq \emptyset}[|S\cap T|\equiv1(\bmod \ 2)]\frac{2}{1-[x^T]\tilde g} \]

代入\([x^T]\tilde g=\sum_{i}(-1)^{[i\in T]}\frac{p_i}{\sum_j p_j}\),得\(1-[x^T]\tilde g=\sum_{i}[i\in T]\frac{2p_i}{\sum_{j}p_j}\),回代入原式,得:

\[[x^S]f=\sum_{T\neq \emptyset}[|S\cap T|\equiv1(\bmod \ 2)]\frac{\sum_{j}p_j}{\sum_{i\in T}p_i} \]

\[[x^S]f=\Big(\sum_j p_j\Big)*\Big(\sum_{T\neq \emptyset}[|S\cap T|\equiv1(\bmod \ 2)]\frac{1}{\sum_{i\in T}p_i}\Big) \]

由於\(\sum_j p_j\)非常小,因此后面的式子可以通過簡單的\(dp\)計算出來。

[ZJOI2019]語言

考場上只會寫3個\(\log\)的我太菜了。

考慮對於一個點,它能交流的所有點就是經過它的鏈的並。

我們可以用線段樹來維護一個點集的連通並的點數(即最小的使得某些點都在內的連通塊的點數),具體做法不講了(想必這篇博客沒有人看的233,如果有人問再加上去吧)。再用樹上差分思想,在點上添加事件,加上線段樹合並,就做完了。

雖然是一個\(\log\)的但我寫出來跑的有點慢,可能我太菜了。

LOJ #575 不等關系

一道不算很難的容斥題。

考慮最簡單的容斥方法,用\(至少違背零個大於號-至少違背一個大於號+至少違背兩個大於號\dots\)來計算,對於至少違背\(k\)個大於號的方案數,可以發現當我們選定了哪些位置違背以后,限制就只剩下小於號了。此時長度為\(n+1\)的排列會被分成\(m\)部分,大小分別為\(a_1,a_2,\dots,a_m\),每一段內要滿足大小遞增。那么此時的答案就是:

\[{n+1\choose a_1,a_2,\dots,a_m}=\frac{(n+1)!}{\prod_{i=1}^ma_i!} \]

\((n+1)!\)對於所有方案都是相同的,我們可以不管它。於是只要將所有段的大小的階乘的逆元相乘就是方案數。

首先考慮暴力做法,我們根據字符串\(s\)先將排列划分為\(m\)段,大小分別為\(a_1,a_2,\dots,a_m\)(這和上面的定義不一樣,只是我懶得換字母了),由於容斥的關系,一些段可能會並起來。我們假定違背了其中\(k\)個大於號,合並后段的大小分別為\(b_1,b_2,\dots,b_{m-k}\),那么這種方案的貢獻為\((-1)^k\Big(\prod_{i=1}^{m-k}\frac{1}{b_i!}\Big)\)

那么考慮\(dp\),我們設\(f_i\)表示只考慮前\(i\)段,所有方案的貢獻和。設\(S_i\)表示\(a\)的前\(i\)項和。那么我們只要枚舉第\(i\)段會與前面的幾段合並,就可以得出方程:

\[f_i=\sum_{j=0}^{i-1}(-1)^{i-j+1}f_j\frac{1}{\Big(S_i-S_j\Big)!} \]

就得到了\(O(n^2)\)的做法。

可以注意到,由於和式中的最后一項非常復雜,因此很難優化成卷積形式。我們考慮更換一種方法,改設\(f_i\)表示只考慮排列的前\(i\)個,所有方案的貢獻和。值得注意的是如果\(i\)\(i+1\)之間是小於,即原本在一段內的,那么我們可以任意取\(f_i\)的值,因為我們將看到它對后面是沒有影響的。我們再設\(a_i\)表示\(i\)\(i+1\)之間是否用大於號連接(即可以斷開),特別的,\(a_0=a_{n+1}=1\)。設\(S_i\)表示\(a\)的前\(i\)項和。

根據之前的思路,易得:

\[f_i=\sum_{j=0}^{i-1}(-1)^{S_i-S_j+1}a_jf_j\frac{1}{(i-j)!} \]

變化一下,得:

\[(-1)^{S_i}f_i=\sum_{j=0}^{i-1}\Big(a_j(-1)^{S_j}f_j\Big)*\Big(-\frac{1}{(i-j)!}\Big) \]

可以發現,雖然其轉化為簡單的卷積式比較困難,但是借助分治fft,我們就可以先將\((-1)^{S_i}f_i\)算出來,再乘上\(a_i\)貢獻給后面了。復雜度\(O(n\log^2 n)\)

所以說,分治fft天下第一。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM