鹿島建設プロコン2020-D Binomial Coefficient is Fun

 公式解説とは異なる、経路数を考えることによる導出を紹介する。

考察

 とりあえず、各B_iを固定して考えよう。 _{B_i} C _{A_i}というのは、縦が B_i-A_iマス、横がA_iマスのグリッドにおいて、左下から右上に右移動と上移動だけで向かうときの経路の数に等しい。この値を掛け算するので、なんとなく大きなグリッドを作りたくなる。

f:id:sigma1113:20201206131454p:plain
これを...
f:id:sigma1113:20201206131623p:plain
こう!

 上図における橙と緑の長方形を通る経路の積がB_iの値を決めたときの答えへの寄与である。本来は\sum B_i \leq MにおけるすべてのBについての和を求めよ、という問題だから、縦を M - \sum Aマスにして、上に移動することがB_iの値を1大きくすることに対応させれば、縦が M - \sum Aマス、横が \sum Aマスのときの左下から最右列のいずれかの点への経路数が答えだ!と信じたいくなる。ところが、残念ながらサンプル1さえ合わない。縦の長さをB_iに対応させようという作戦だったが、上図の橙と緑の長方形の境界部分の点から上に移動することが、B_1に寄与するのかB_2に寄与するのかの対応が不明瞭になるのである。
 そこで、この間に1列足してみる。

f:id:sigma1113:20201206132522p:plain
これならどうだ

 この1列を横に移動することが、上に移動することをB_iへの寄与からB_{i+1}への寄与に変えるという役割を果たす。このようにすれば、左下から最右列へのいずれかの点への経路のとったときに、今足した1列をどこで通り過ぎたかを見ることで、Bとの対応をとることができる。
 従って、答えはS = \sum A_iとして、 M-Sマス、横がS+N-1マスのグリッドにおいて、左下から最右列のある点に右移動と上移動だけで向かうときの経路数に等しくなる。ところが、ゴール地点がO(M)個あるので、このまま計算しようとしても間に合わない。そこで、さらに右に1列足してみる。

f:id:sigma1113:20201206133703p:plain

1列追加する前のグリッドの「左下から最右列のある点に行く経路数」が答えだったが、赤い列を横に移動することが、この「ある点」を決めることに対応することがわかる。つまり、答えは「 M-Sマス、横がS+Nマスのグリッドにおいて、左下から右上の点に右移動と上移動だけで向かうときの経路数」となる。これは _{M+N} C _{S+N}であり、公式解説の述べる値に一致した。