「解题报告」AGC019F Yes or No
每次碰到折线计数的题都不会做啊!怎么回事。
首先考虑将问题转换成在一个 \(n \times m\) 的网格上走,从 \((n, m)\) 到 \((0, 0)\)。首先最优策略肯定是哪个多选哪个,放到这个图上来说就是对于 \(y=x\) 这条直线下面的点都向左选,上面的都向下选,直线上方的点可以任意选。我们钦定向左选。
贺一个舟亮陈的图。
那么我们要统计的问题实际上是每一条路径经过的红线的和。然后就是折线图经典操作,当经过直线的时候把直线上方的折线翻折下去。发现这样会少统计的位置只有直线上每个点向左走的贡献,而除此之外经过的红线一定是 \(m\) 条(这么说期望答对一半以上的题诶,好厉害)。
那么只需要统计从直线上每个点向左走的概率之和即可,这个概率就是经过这个点且这一步向左走的概率。
好简单,但是还是想不到。
int main() {
scanf("%d%d", &n, &m);
if (n > m) swap(n, m);
init(n + m);
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = (ans + 1ll * C(m - i + n - i, n - i) * C(2 * i, i) % P * ((P + 1) / 2) % P) % P;
}
ans = 1ll * ans * qpow(C(n + m, n), P - 2) % P;
ans = (ans + m) % P;
printf("%d\n", ans);
return 0;
}
// yspm 能不能不要 D 我!