随机分析:逐元素概率转移¶
出题人的元素位置概率递推。Codex(GPT-6)使用滚动数组整理 C++17 实现,并将终态概率按元素数值累加为矩阵。程序:alternative-element-probabilities.cpp。首选方案与比较见主解。
追踪一个原始元素¶
模数记为 \(M=998244353\) .
暂时用原下标区分所有元素,即使它们的值相同。固定原位置 \(s\) 的元素,令 \(q_j\) 为它当前位于位置 \(j\) 的概率。初始 \(q_s=1\) ,其他位置为零。
第 \(i\) 轮先保存 \(c=q_i\) .对 \(j\ne i\) :该元素若原在 \(j\) ,有 \((n-1)/n\) 的概率保留;若原在 \(i\) ,有 \(1/n\) 的概率移入。这两个事件互斥,所以
\[
q'_j=(n-1)n^{-1}q_j+n^{-1}c\pmod M
\]
它最终位于本轮位置 \(i\) 的概率为
\[
q'_i=n^{-1}\sum_jq_j=n^{-1}
\]
因为这一个元素恰好位于某一个位置。上述论证对任何历史状态成立,逐轮归纳即可得到正确的终态分布。
合成答案¶
记该分布为 \(q_{s,j}\) ,对每个原始元素,把 \(q_{s,j}\) 加到矩阵条目 \(P_{j,a_s}\) .位置 \(j\) 在最终恰好容纳一个元素,因此不同原始元素占据该位置的事件互斥,同值元素的概率可以相加。矩阵的列是数值,不能直接把原下标当作列号。
复杂度与取舍¶
每个原始元素进行 \(n\) 轮、每轮更新 \(n\) 个位置,总时间 \(O(n^3+\log M)\) .单元素概率使用 \(O(n)\) 滚动空间;输出矩阵占 \(O(n^2)\) ,故总空间为 \(O(n^2)\) .
该方案直接展示每个元素的去向,可以独立检查更快的递推。它是正确的备用计算程序;当前范围内的计时状态见主解。每轮使用保存的旧 \(c\) ,避免更新顺序污染概率。