そのうち誰かの役に立つ

もしくは誰の役にも立たない

競プロチャレンジ供養会場: AtCoder Beginner Contest 205 E - White and Black Balls

コンテストでの時間切れや解けなかった過去問を振り返って供養していく

問題

Difficulty: 2025 (記事作成時点)

供養

解法

  • $N \gt M + K$ のとき、自明に $0$
  • $(x, y) = (0, 0)$ から $x = x + 1$ もしくは $y = y + 1$ を繰り返して $(M, N)$ に到達するパターン数を数える問題と同義
  • 全パターン数は $_{N + M}\mathrm{C}_{N}$
  • NGの経路パターンを以下のように考える
    • $K = N$ のとき、NGとなる経路は存在しない
    • NGのとき、少なくとも1回は直線 $y = x + K + 1$ に接触するような経路を通っている
    • そのような経路において、$(0, 0)$ から接触した点 $(x, y)$ までの経路を直線 $y = x + K + 1$ について対象となるように描くと、必ず $(-K - 1, K + 1)$ から $(x, y)$ までの経路となる
    • したがって、NGとなる経路は $(-K - 1, K + 1)$ から $(M, N)$ まで移動するパターン数 $_{N +M}\mathrm{C}_{N - K - 1}$ と同値
  • 全パターン数からNGパターン数を引いた値が答え

実装

計算量は $O(N + M)$

公式解説

躓いた点

  • $(0, 0)$ を直線で折り返して $(-K - 1, K + 1)$ に集約すればよいことに気が付かなかった