loading

P5400 [CTS2019] 随机立方体

这题一定程度上锻炼了我的推式子能力

比较中清新的一道计数题。

题意

给定一个 \(n\times m\times k\) 的三维立方体,你需要将 \(1\sim nmk\) 这些数都填到立方体的 \(nmk\) 个点里,使得每个数恰好出现一次。定义极大点为一个点使得 对于所有存在至少一维坐标和该点相同的点,这些点上面写的数字都比该极大点小。若填数方案在 \((nmk)!\) 种方案中随机,求恰好存在 \(t\) 个极大点的概率。\(\bmod998244353\)

多组数据,\(T\le 10,n,m,k\le 5\times10^6\)

分析

先把概率乘以总方案数转计数,虽然总方案数过大无法计算,但我们要相信它迟早会被消掉

不难发现所有极大点的三个坐标两两不同,且至多有 \(\min(n,m,k)\) 个极大点。

恰好数量计数向来不好做,转化成钦定至少有 \(i\) 个极大点,其余随意的方案数,然后用二项式反演把答案演回去。具体地,设答案为 \(ans\),钦定至少 \(i\) 个极大点的方案数为 \(f_i\),则 \(ans=\sum_{i=t}^{\min(n,m,k)}\dbinom{i}{t}(-1)^{i-t}f_i\)

考虑如何求 \(f_i\)。令一个极大点支配另一个点当且仅当该点存在至少一维使得该点的这些维坐标和极大点相同。先考虑把极大点们的坐标方案数算出来,然后将不在极大点支配下的普通点提前算好标号方案数。不在极大点支配下的普通点数量用总体减不合法可以算得是 \(nmk-(n-i)(m-i)(k-i)\)。若令 \(q_i=(n-i)(m-i)(k-i)\),则不受支配的普通点数量为 \(q_0-q_i\),标号方案数就是 \(A_{q_0}^{q_i}\)。而极大点坐标方案数为 \(A_{n}^iA_m^iA_k^i\)\(A\) 为排列数,然而这个式子会把一种方案算 \(i!\) 遍,但由于后续会按照大小关系的顺序考虑限制,所以此处也相当于算了大小关系。整理得出 \(f_i=A_n^iA_m^iA_k^iA_{q_0}^{q_i}g_i\),其中 \(g_i\) 表示将剩余的点合法标号的方案数。

考虑如何求 \(g\)。令我们当前要求的是 \(g_p\),我们需要求出剩余的点中只被点值第 \(i\) 小的极大点支配而不被那些点值更小的极大点支配的点的数量,答案就是能被前 \(i\) 小的极大点支配的点数 \(nmk-(n-i)(m-i)(k-i)=q_0-q_i\) 减去能被前 \(i-1\) 小的极大点支配的点数 \(q_0-q_{i-1}\),为 \(q_{i-1}-q_i\)。考虑按照极大点的点值从大往小插入,设只被第 \(i\) 大(即 第 \(p-i+1\) 小)支配的点数为 \(s_i=q_{p-i}-q_{p-i+1}\),填完前 \(i-1\) 大还剩下 \(q_0-q_{p-i+1}\) 个空位置,而最大的位置肯定要给极大点,然后方案数就是在 \(q_0-q_{p-i+1}-1\) 个位置中选出 \(q_{p-i}-q_{p-i+1}-1\) 个位置并钦定顺序,即为 \(A_{q_0-q_{p-i+1}-1}^{q_{p-i}-q_{p-i+1}-1}\)

考虑化简 \(g\)。不妨将 \(g_p\) 展开:

\[g_p=\prod_{i=1}^pA_{q_0-q_{p-i+1}-1}^{q_{p-i}-q_{p-i+1}-1}=\prod_{i=1}^pA_{q_0-q_i-1}^{q_{i-1}-q_i-1}=\prod_{i=1}^p\dfrac{(q_0-q_i-1)!}{(q_0-q_{i-1})!} \]

注意到前一项的分子和后一项的分母可以约掉,然后把第一项分母和后一项分子提出来:

\[g_p=(q_0-q_p-1)!\prod_{i=1}^{p-1}\dfrac{1}{q_0-q_i} \]

\(g\) 代回 \(f\)

\[f_i=A_n^iA_m^iA_k^iA_{q_0}^{q_i}g_i=A_n^iA_m^iA_k^i\dfrac{q_0!}{(q_0-q_i)!}(q_0-q_i-1)!\prod_{j=1}^{i-1}\dfrac{1}{q_0-q_j} \]

\[f_i=A_n^iA_m^iA_k^i\cdot q_0!\cdot \prod_{j=1}^{i}\dfrac{1}{q_0-q_j} \]

这只是方案数,但注意到最终要求的概率等于方案数除以 \((nmk)!=q_0!\),刚好和 \(f_i\) 中的 \(q_0!\) 抵消,所以我们可以视 \(f_i=A_n^iA_m^iA_k^i\prod_{j=1}^{i}\dfrac{1}{q_0-q_j}\) 即可。而 \(f_{1,\cdots,n}\) 这个东西是很好在 \(O(n)\) 的时间复杂度内预处理出来的(注意要使用 \(O(1)\) 逆元才是严格线性),计算 \(ans\) 本身也只有 \(O(n)\) 的复杂度,故总时间复杂度 \(O(n)\)

最后挂个式子:

\[ans=\sum_{i=t}^{\min(n,m,k)}\dbinom{i}{t}(-1)^{i-t}\cdot A_n^iA_m^iA_k^i\prod_{j=1}^{i}\dfrac{1}{q_0-q_j} \]

posted @ 2024-12-15 20:47  dcytrl  阅读(35)  评论(0)    收藏  举报