CodeForces 708E Student's Camp
有一个 (n+2)×m 的长方形,除了第一行和最后一行,其他每一行每一天最左边和最右边的格子都有 p 的概率被摧毁,每行之间独立且左边和右边独立,求 k 天之后最上面一行与最下面一行四联通的概率。
其中 1≤n,m≤1500,0≤k≤105,答案对 109+7 取模。
一个简单的想法就是我们令 hi,l,r 表示 k 天后第 i 行还剩下 [l,r],前 i 行联通的概率。Pl,r 表示单独一行只剩 [l,r] 的概率。
首先我们有:
hi,l,r=Pl,r[l,r]∩[l′,r′]=∅∑hi−1,l′,r′
接下来我们考虑 Pl,r,我们令 qi=(ik)pi(1−p)k−i,不难发现:
Pl,r=ql−1qm−r
然后我们令 fi,r 表示右端点为 r 的所有 h 之和,同理 gi,l 表示以左端点为 l 的所有 h 之和,再令 Fi,r 表示右端点小于等于 r 的所有 h 之和,同理 Gi,l 表示以左端点大于等于 l 的所有 h 之和。
具体地:
fi,rgi,lFi,rGi,l=l=1∑rhi,l,r=r=l∑mhi,l,r=R=1∑rfi,R=L=l∑mgi,L
于是我们就有:
hi,l,r=Pl,r(Fi−1,m−Fi−1,l−1−Gi−1,r+1)
将 h 代入 f 和 g,我们有:
fi,rgi,l=l=1∑rql−1qm−r(Fi−1,m−Fi−1,l−1−Gi−1,r+1)=qm−r(l=1∑rql−1(Fi−1,m−Fi−1,l−1)−Gi−1,r+1l=1∑rql−1)=r=l∑mql−1qm−r(Fi−1,m−Fi−1,l−1−Gi−1,r+1)=ql−1(r=l∑mqm−r(Fi−1,m−Gi−1,r+1)−Fi−1,l−1r=l∑mqm−r)
考虑到最后答案是 Fn,m,我们发现我们可以绕过 h 来求 F。
最终复杂度 O(k+nm)。
代码可以看 这里。