「解题报告」AGC019F Yes or No

每次碰到折线计数的题都不会做啊!怎么回事。

首先考虑将问题转换成在一个 \(n \times m\) 的网格上走,从 \((n, m)\)\((0, 0)\)。首先最优策略肯定是哪个多选哪个,放到这个图上来说就是对于 \(y=x\) 这条直线下面的点都向左选,上面的都向下选,直线上方的点可以任意选。我们钦定向左选。

贺一个舟亮陈的图。

image

那么我们要统计的问题实际上是每一条路径经过的红线的和。然后就是折线图经典操作,当经过直线的时候把直线上方的折线翻折下去。发现这样会少统计的位置只有直线上每个点向左走的贡献,而除此之外经过的红线一定是 \(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 我!
posted @ 2023-04-29 14:40  APJifengc  阅读(24)  评论(0编辑  收藏  举报