Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 293 C問題 Make Takahashi Happy

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

 H W 列のマスがある. 上から  i 列目, 左から  j 列目のマスを  (i,j) と呼ぶ.

 (i,j) には整数  A_{i,j} が書かれている.

高橋くんは  (1,1) にいる. 高橋くんは以下の行動を繰り返して,  (H,W) を目指す.

  • (存在する) 左隣のマスか (存在する) 下隣のマスに移動する.

高橋くんの移動の方法のうち,  (1,1), (H,W) を含めた高橋くんが通ったマスに書かれている整数が全て異なるような移動の方法の数を求めよ.

制約

  •  1 \leq N \leq 2 \times 10^5
  •  1 \leq A_i \leq N
  •  A_i \neq i

解法

このような移動は下の移動を  (H-1) 回, 右の移動を  (W-1) 回行うとマス  (H,W) に到達できる. また,  (H,W) に到達できる方法は下の移動を  (H-1) 回, 右の移動を  (W-1) 回することである.

よって, 合計  (H+W-2) 回の移動の方法のうち, 下に移動する  (H-2) 回がいつかを指定し, 実際にそのような移動の方法は条件を満たすかどうかを調べれば良い.

見るべき経路の数は

 \dbinom{H+W-2}{H-1}

であり, これは最大で  H=W=10 のときの  48620 通りであり, 各経路に関して  O(H+W) 時間で判定できる.

よって,  O \left(\dbinom{H+W-2}{H-1} (H+W) \right) 時間で数え上げることができる.