[ZJOI2019] 開關 (一種擴展性較高的做法)
題意:
有n個開關,一開始狀態都為關閉。每次隨機選出一個開關將其狀態改變,選出第i個開關的概率為${ p_i \over \sum_{i=1}^n p_i} $,求狀態第一次變為s的操作步數。
題解:
考慮先從組合方法入手。
最基本的思路就是枚舉一種必定結束的狀態,但是這樣的狀態不一定合法,因為這個狀態的前綴可能已經結束了,所以我們可以容斥若干個前綴,強制這些前綴已經結束,來算出這個狀態中沒有一個前綴能夠結束的方案數。
當然,在枚舉的過程中,"一種狀態"可以通過枚舉每一個開關的操作次數\(x_i\),再將這些操作次數排列起來,我們枚舉前綴的時候,同樣枚舉每個開關的操作次數,那么我們可以寫出答案的式子:
\(q_i\)為\(p_i \over \sum p_i\)
看起來十分復雜,其實有很多可以化簡的地方,為了保證題解的簡潔性,這里不一一贅述。上述式子最難化簡的莫過於是\(\sum x_i\),這個其實是一個帶權方案數,在算的時候我們可以認為是計算$[y^1]\prod_{i=1}^n (1+x_iy) $,所以只需要記常數項與一次項系數。
用指數型生成函數來表示,可以方便的得到答案式子:
記\(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}\)
答案為
我們發現在\(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}\),所以是可以約去的。
這種做法與網上的大致相同,但是在處理\(\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
