UER #6 逃跑
设总方案数为 \(all=(w_1+w_2+w_3+w_4)^n\) 种,第 \(i\) 个方案经过的不同位置个数为 \(d_i\),则有:
由于 \(\overline d=\frac{\sum d_i}{all}\),故有:
所以我们只需要算出 \(\sum d_i^2\) 和 \(\sum d_i\) 即可。
先考虑 \(\sum d_i\) 怎么做。考虑利用期望的线性性,把贡献下放到每个位置上,统计第 \(i\) 步能走到的首次经过位置个数。则对于这些节点,贡献为后面步数随便走的方案数。(我们可以总结的套路是,如果存在取多次只算一次贡献,不妨将贡献放到取第一次上)
考虑我们在第 \(i\) 步走到某个位置时,该位置不是第一次走到,那么我们一定可以找到第一次走到该位置的步数 \(p\),且在 \(p\) 后的 \(i-p\) 步一定是绕了若干圈又回到原地。
所以不妨设 \(f_i\) 表示第 \(i\) 步能走到的新位置的总贡献,\(all_i=(w_1+w_2+w_3+w_4)^i\),\(s(p,i,j)\) 表示从当前节点 \((x,y)\) 开始,走 \(p\) 步之后走到 \((x+i,y+j)\) 的方案数。其中 \(s(p,i,j)\) 可以通过递推在 \(O(n^3)\) 以内求出。则有转移:
初始为 \(f_0=1\)。则:
接下来考虑 \(\sum d^2\)。请在求平方期望时考虑其组合意义,对于方案中新位置对计数。
故我们现在要求的就是,中途经过位置 \((i,j)\)、第 \(p\) 步时第一次经过另一个位置 \((i+x,j+y)\) 的方案数,我们将其设为 \(g(p,x,y)\)。总方案数可以为 \(f_k\) 和 \(s(p-k,x,y)\) 拼接的结果,但如果这样我们会算重一些方案:
-
我们并非先走到了 \((i,j)\) 再走到了 \((i+x,j+y)\),而是先 \((i+x,j+y)\),再到 \((i,j)\)。这部分的方案数为 \(g(k,-x,-y)\times s(p-k,x,y)\)。
-
我们并非第一次走到 \((i+x,j+y)\)。这部分的方案数为 \(g(k,x,y)\times s(p-k,0,0)\)。
把它们减去,即可得到 \(g(p,x,y)\):
于是我们可以得到:
乘 \(all_{n-p}\) 的原因和前面一样,我们找到位置对之后后面的步数可以随便走。乘 \(2\) 是因为一个位置对会造成两次贡献。
总时间复杂度 \(O(n^4)\),瓶颈在 \(g\) 的求解。
注意 \(g(*,0,0)\) 不合法一定为 \(0\),以及在求解 \(g\) 时需要尽量减少枚举常数。