【CTS2019】隨機立方體
隨便觀察一下,不難發現如下的性質:
-
任意兩個極大值點\((x_1,y_1,z_1),(x_2,y_2,z_2)\)都存在\(x_1\neq x_2,y_1\neq y_2,z_1\neq z_2\),這是因為極大值點必須大于其所在平面上的任意數。
-
根據上面的性質不難發現極大值點的個數不會超過\(\min(n,m,l)\)。
要求的是恰有\(k\)個極大值點的概率,如果有\(ans\)種方案滿足要求,那么答案就是\(\frac{ans}{(nml)!}\)。
這一看就不能直接做,考慮二項式反演,求一個\(g_i\)表示至少存在\(i\)個極大值點的方案數。那么顯然有\(ans=\sum_{i=k}^{\min(n,m,l)}(-1)^{i-k}\binom{i}{k}g_i\)。
考慮\(g_i\)怎么求,首先我們得先選出\(i\)個三維坐標互不相同的點,之后會剩下\((n-i)(m-i)(l-i)\)個點,這些點不和任何被欽定的極大值點在同一個平面內,所以沒有限制,隨便選出來就好了。這邊的方案數就是\(n^{\underline i}m^{\underline i}l^{\underline i}(nml)^{\underline {(n-i)(m-i)(l-i)}}\)。
對于剩下的\(nml-(n-i)(m-i)(l-i)\)個點我們要確定一個順序,使得欽定的\(i\)個點都成為極大值點。
設\(\varphi(i)=(n-i)(m-i)(l-i)\),由于前面我們確定了點的順序,考慮從大到小考慮每一個極大值點。我們發現當我們確定一個極大值點填什么的時候,會有一些點被解放出來,這些點就可以隨便填了。不難發現這些點只和這個極大值點在同一個平面上,于是我們能確定這些點的個數。
存在\(i-1\)個極大值點的時候,有限制的點的個數是\(nml-\varphi(i-1)\);當極大值點變成\(i\)個的時候,有限制的點變成了\(nml-\varphi(i)\)個。不難發現這些新增加的點就是只被這個新加入的極大值點控制的點,這樣的點的個數是\(nml-\varphi(i)-nml+\varphi(i-1)=\varphi(i-1)-\varphi(i)\)個。我們確定好當前這個極大值的值后這些被控制的點就可以隨便填了,于是方案數就是\(A(nml-\varphi(i)-1,\varphi(i-1)-\varphi(i)-1)=\frac{(nml-\varphi(i)-1)!}{(nml-\varphi(i-1))!}\)。
于是填\(i\)個極大值點的方案數就是\(\prod_{j=1}^i\frac{(nml-\varphi(j)-1)!}{(nml-\varphi(j-1))!}\),經過一番約分可以發現其實就是\((nml-\varphi(i)-1)!\prod_{j=1}^i\frac{1}{nml-\varphi(j-1)}\)。不難發現\((nml-\varphi(i)-1)!\)和\((nml)^{\underline {\varphi(i)}}\)很搭,乘在一起就是\((nml)!(nml-\varphi(i))!\)。
于是
容斥后還需要除一個\((nml)!\),于是直接在容斥的過程中將其除掉即可。
用一下線性求逆元的trick就可以做到\(O(Tn)\)了。
代碼。

浙公網安備 33010602011771號