ABC231G & ABC232G 题解
「ABC231G」Balls in Boxes(期望推式子 + DP)
题面
题意:
有 \(n\) 个盒子,每个盒子里一开始有 \(A_i\) 个球,你可以进行 \(K\) 次如下操作:
- 随机选择一个盒子,往这个盒子里放入一个球。
设 \(B_i\) 为第 \(i\) 个盒子里最终有的球的数量,权值 为 \(\prod\limits_{i=1}^n B_i\),求期望权值大小。
数据范围:\(1\le n\le10^3\),\(1\le K\le 10^9\),\(0\le A_i\le10^9\)。
将 \(B_i\) 拆成 \(A_i+X_i\),其中 \(X_i\) 是第 \(i\) 个盒子里被选中的次数。这样做的好处是把每个 \(A_i\) 和 \(X_i\) 拆出来了,利用了 \(X_i\) 独立的性质。
\[\begin{aligned} &E[\prod\limits_{i=1}^n(A_i+X_i)]\\ =&\sum\limits_{i=1}^n S_{n,i}(A_1,A_2,\dots,A_n)E(\prod\limits_{j=1}^{n-i}X_j) \end{aligned} \]其中 \(S_{n,i}(A_1,A_2,\dots,A_n)\) 为在 \(A_1,A_2,\dots,A_n\) 中选出 \(i\) 个数的乘积的和。
对于前后两部分分开算:
-
前一部分可以直接 DP:设 \(f_{i,j}\) 为前 \(i\) 个数选了 \(j\) 个的乘积的和,则 \(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times A_i\)。
-
后一部分继续拆式子,设 \(X_{i,j}\) 为第 \(j\) 轮是否选中 \(i\):
\[\begin{aligned} &E(\prod\limits_{i=1}^m X_i)\\ =&E[\prod\limits_{i=1}^m(\sum\limits_{j=1}^K X_{i,j})]\\ =&\sum\limits_{j_1,j_2,\dots,j_n}E(\prod\limits_{i=1}^m X_{i,j_i}) \end{aligned} \]容易发现在 \(j_i\) 和 \(j_o\) 相同的时候 \(X_{i,j_i}\not= X_{o,j_o}\),即它们两个中一定有一个 \(0\),这个时候 \(E(\prod\limits_{i=1}^m X_{i,j_i})\) 为 \(0\),否则 \(E(\prod\limits_{i=1}^m X_{i,j_i})\) 就等于 \((\frac{1}{n})^m\)。因为每一个 \(j_i\) 之间有顺序关系,那么这一个式子就为 \(\prod\limits_{i=1}^{m}(K-i+1)(\frac{1}{n})^m\)。可以递推计算。
将两部分式子拼起来就是答案。
Code:https://atcoder.jp/contests/abc231/submissions/29979297。
「ABC232G」Modulo Shortest Path(优化建图 + 最短路)
题面
题意:
有一张 \(n\) 个点的有向完全图,每个点有两个属性 \(A_i\) 和 \(B_i\),点 \(i\) 向点 \(j\) 连的边边权为 \((A_i+B_j)\mod M\)。问图中 \(1\) 到 \(n\) 的最短路。
数据范围:\(2\le n\le2\times10^5\),\(2\le M\le10^9\),\(0\le A_i,B_i
。
直接把图建出来肯定是不现实的,于是考虑怎么优化连边。
建两层点分别为 \(1\sim n\) 和 \(n+1\sim 2n\),大概可以理解为入点和出点。
把 \(B\) 数组排序,设排序后 \(B\) 数组的第 \(i\) 项原本是 \(c_i\),那么 \(\forall 1\le i
跑一遍 Dijkstra 即可。
Code:https://atcoder.jp/contests/abc232/submissions/29948754。