CF708E Student's Camp
题意
- 有一个 (n+2)×m 的网格。
- 除了第一行和最后一行,其他每一行每一天最左边和最右边的格子都有 p 的概率消失。
- 求 k 天后,网格始终保持连通的概率。
- n,m≤1.5×103,k≤105,答案对 109+7 取模。
题解
网格始终保持连通,等价于 k 天后任意相邻两行剩下的区间有交。
考虑区间 dp,设 fi,l,r 表示前 i 行连通且第 i 行剩下的区间为 [l,r] 的概率。
初始条件为 f0,1,m=1,转移:
fi,l,r=pl,r[l′,r′]∩[l,r]=∅∑fi−1,l′,r′
其中 pl,r 表示 k 天后剩下 [l,r] 的概率,有 pl,r=pl−1×pm−r,pi=(ik)pi(1−p)k−i。
直接做是 O(nm2) 的,显然无法接受。
设 fri,r=∑l≤rfi,l,r,sri,j=∑r≤jfri,r。
同理设 fli,l=∑l≤rfi,l,r,sli,j=∑l≥jfli,l。
由于左右完全对称,因此 fli,j=fri,m+1−j,sli,j=sri,m+1−j。
则有:
fi,l,r=pl,r[l′,r′]∩[l,r]=∅∑fi−1,l′,r′=pl,r(sri−1,m−sri−1,l−1−sli−1,r+1)=pl,r(sri−1,m−sri−1,l−1−sri−1,m−r)
于是我们只需要计算 fri,j,然后前缀和求出 sri,j 即可。
又有:
fri,r=l≤r∑fi,l,r=l≤r∑pl,r(sri−1,m−sri−1,l−1−sri−1,m−r)=((sri−1,m−sri−1,m−r)pm−rl≤r∑pl−1)−(pm−rl≤r∑pl−1sri−1,l−1)=pm−r((sri−1,m−sri−1,m−r)l≤r∑pl−1−l≤r∑pl−1sri−1,l−1)
那么我们可以预处理 qr=∑l≤rpl−1,gi,r=∑l≤rpl−1sri,l−1,然后 O(nm) 计算出所有的 fri,j,sri,j,从而计算出最终的答案,也就是 srn,m。
代码
const int N = 1.5e3 + 7;
int n, m, k, a, b;
modint x, p[N], q[N], f[N][N], s[N][N], g[N][N];
inline modint binom(int i, int j) {
modint a = 1, b = 1;
for (int k = 1; k <= j; k++) a *= i + 1 - k, b *= k;
return a / b;
}
int main() {
rd(n), rd(m), rd(a), rd(b), rd(k), x = (modint)a / b;
for (int i = 0; i <= min(m, k); i++)
p[i] = binom(k, i) * (x ^ i) * ((1 - x) ^ (k - i));
for (int i = 1; i <= m; i++) q[i] = q[i-1] + p[i-1];
f[0][m] = s[0][m] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
f[i][j] = p[m-j] * ((s[i-1][m] - s[i-1][m-j]) * q[j] - g[i-1][j]),
s[i][j] = s[i][j-1] + f[i][j],
g[i][j] = g[i][j-1] + p[j-1] * s[i][j-1];
print(s[n][m]);
return 0;
}
评论
暂无已公开评论。