有n個開關,一開始狀態都爲關閉。每次隨機選出一個開關將其狀態改變,選出第i個開關的機率爲${ p_i \over \sum_{i=1}^n p_i} $,求狀態第一次變爲s的操做步數。函數
考慮先從組合方法入手。
最基本的思路就是枚舉一種一定結束的狀態,可是這樣的狀態不必定合法,由於這個狀態的前綴可能已經結束了,因此咱們能夠容斥若干個前綴,強制這些前綴已經結束,來算出這個狀態中沒有一個前綴可以結束的方案數。
固然,在枚舉的過程當中,"一種狀態"能夠經過枚舉每個開關的操做次數\(x_i\),再將這些操做次數排列起來,咱們枚舉前綴的時候,一樣枚舉每一個開關的操做次數,那麼咱們能夠寫出答案的式子:
\[\sum_{x_i} \prod [2|x_i-s_i] \prod q_i^{x_i} \sum_{i=1}^nx_i \sum_{m=0}^{\infty} \sum_{y_{1i};\exists i,y_{1i}>0 } \sum_{y_{2i};\exists i,y_{2i}>0 }... \sum_{y_{mi};\exists i, y_{mi}>0 } \sum_{{z_i};\exists i,z_i>0 }\\ \prod [2|y_{ij}] \prod_{j}[\sum_{i=1}^m y_{ij} +z_i = x_i] (-1)^m {(\sum_{i=1}^m z_i)! \over \prod_{i=1}^n z_i!}\prod_{i=1}^m {(\sum_{j=1}^n y_{ij})! \over \prod_{j=1}^n y_{ij}} \]
\(q_i\)爲\(p_i \over \sum p_i\)spa
看起來十分複雜,其實有不少能夠化簡的地方,爲了保證題解的簡潔性,這裏不一一贅述。上述式子最難化簡的莫過因而\(\sum x_i\),這個實際上是一個帶權方案數,在算的時候咱們能夠認爲是計算$[y^1]\prod_{i=1}^n (1+x_iy) $,因此只須要記常數項與一次項係數。code
用指數型生成函數來表示,能夠方便的獲得答案式子:
\[F(x)=\prod (e^{q_ix} + q_ixye^{q_ix} +(-1)^{s_i} e^{-q_ix} - (-1)^{s_i} xye^{-q_ix}) \\ =\sum_{i=0}^{\infty} {f_{1i} \over i!}x^i + {f_{2i} \over i!}x^iy\]get
\[G(x)=\prod (e^{q_ix} + q_ixye^{q_ix} + e^{-q_ix} -xye^{-q_ix}) \\ =\sum_{i=0}^{\infty}{g_{1i} \over i!}x^i + {g_{2i} \over i!}x^iy\]io
記\(f_0(x)=\sum_{i=0}^{\infty}f_{0i}x^i,f_1(x)=\sum_{i=0}^{\infty}f_{1i}x^i,f(x)=f_0(x)+f_1(x)y\)
\(g_0(x)=\sum_{i=0}^{\infty}g_{0i} x^i,g_1(x)=\sum_{i=0}^{\infty}g_{1i}x^i,g(x)=g_0(x)+g_1(x)y\)
以\(F(x)\)爲例,\(F(x)=\sum_{i=- \infty}^{\infty} a_i e^{ix} + b_i xy e^{ix}\)
能夠獲得\(f(x)=\sum_{i=- \infty}^{\infty} {a_i \over 1-ix}+{b_i x\over (1-ix)^2}\)
答案爲
\[\lim_{x \to 1 }[y^1]f(x)\sum_{m=0}^{\infty}(-g(x)+1)^m=\lim_{x \to 1}[y^1]{f(x) \over g(x)}\\ ={f_2(x)g_1(x) -g_2(x)f_1(x) \over g_1^2(x)}\]
咱們發如今\(g_1(x)\)中有\(\frac {1} {1-x}\)的項,在\(f_2(x),g_2(x)\)有\(\frac {1} {(1-x)^2}\)的項,因此咱們發現,答案的分子有三階無窮大的項,分母有二階無窮大的項。
那麼是否意味着答案發散呢?偏偏相反,由於感性理解答案確定是收斂的,因此咱們有理由認爲分子上三階無窮大的係數爲0,而事實也確實如此,由於\(f_2(x)與g_2(x)\)的\(1 \over (1-x)^2\)項係數相同,\(f_1(x)與g_1(x)\)的\(1 \over 1-x\)項的係數也相同,咱們計算答案,只須要計算分子的二階無窮大的值除以分母的二階無窮大的值便可,又由於兩個無窮大都爲\({1\over (1-x)^2}\),因此是能夠約去的。class
這種作法與網上的大體相同,可是在處理\(\sum x_i\)項的時候不太同樣,網上題解大可能是用的求導來解決第i項對答案的貢獻爲i的問題,而本文觀察到了\(\sum x_i = [y^1]\prod (1+x_iy)\)的性質。這種作法無疑具備比較高的擴展性,例如操做開關i須要\(a_i\)的代價,求代價的指望,求導方法便顯得十分無力,而這個方法只須要將原式稍稍更改爲\(\sum a_i x_i = [y^1]\prod (1+a_ix_iy)\)便可。
code擴展