ここであまり得意でないパターンの問題が出てきたのでメモです。DEGwerさんの数え上げPDFなんかにはいろんな種類が載っているので、また出てきたら追加します。数式をごちゃごちゃいじるとできるパターンもそのうち載せたいです。
について計算をしたい、とします。
これは、一回の移動でだけ移動できるとしたときの、座標
から
への最短移動経路の経路数です。
について計算します。
これは、座標から
への最短経路の場合の数を、
について足し合わせたものです。
上の(適当な)図の、水色が今求めたい部分です。その上の行にある、黄色く塗られた部分のマスについて注目します。
水色のマスに行くには、まず黄色のマスの少なくとも1つを通らなければ、たどり着くことはできません。そして、赤い矢印のうちいずれか1つを必ず通ります。しかも、2本以上その矢印を通ることはありません。矢印を通った後は、水色のマスにたどり着くまでひたすら右に進む必要があります。
つまり、赤い矢印それぞれについて経路が重複することはないため、それぞれの赤い矢印について、そこを通る経路数を計算し、その総和を求めれば、それが水色のマスへの経路数になります。
そして、赤い矢印を通る経路数は、赤い矢印の始点である黄色いマスの経路数そのものです(から
の矢印ならば、
の経路数である
)。よって、結果として矢印の経路数の総和である水色のマスの経路数は、
となりました。
例題(ABC154 F - Many Many Paths)
を求める問題です。
式変形をすると、
となり、ここでを使うと、
になります。これで計算量が落ち、答えを求めることができます。
(
のとき
のため)
(少し展開して
を削除)
(
を外にだす)
(再びまとめる)
(
をΣの外に出し、
を0-indexedに直す)
(二項定理)
となります。
例題(ABC 150 E - Change a Little Bit)
提出コード
できるだけコストの小さいものから使用していくのが良いです。ということで、今回は全パターンの総和を求めるため、の順番を変えても差し支えないことから、
を昇順でソートします。今後、
は0-indexedだとします。
番目のビットを変化させるとします。このとき、問題文にも書いてあるように、残っている個数を
とすると、
のコストがかかります。
より小さい番号のビットは
ともにそろっているとします。これらは
ビット存在し、元々のビットパターンが
の4通りなので、この部分は
通り存在します。
番目のビットは、
の2通り存在します。
さて、より後ろの部分は、
ビット存在します。
この中で、ビットが
で異なっているとします。
ビットは初めからそろっていることになります。
そろっているビットはの2通り、異なるビットも
の2通りです。ということで、ビットの組み合わせ自体は
通りです。そして、
ビットの中から、現在異なっている
ビットを選ぶのは、
通りとなります。
そして、このときにコストはかかります。
については、
の選び方があり、それぞれ総和を求めていかなければなりません。
長々と条件を書きましたが、これらを全てまとめて書くと、
2の累乗とを外に出してまとめると、
となります。さらにの部分を分配法則を用いて変形し、
*
とすると、および、二項定理
から、
となります。これで計算量が落ち、答えを求めることができます。