AtCoder Grand Contest 013 E. Placing Squares(+open problem)
問題概要
読んで: E - Placing Squares
解法
とりあえず置いてはいけない箇所の制約を無視する。
とおけば、置いてはいけない場所がなかった状態での求めるべき値は の の係数。であるからまあとしてもよい。 さて、具体的にこの関数の 次の係数を とすると、
のinverseであるから、漸化式
となる。まあdpから考えれば自明に出てくる式で、いちいちFPSを経由しなくても良い。
高 校 数 学
さて、上記漸化式がについて成り立っている時、命題が成立していると呼称することにする。
とが成立しているならば、
である。 2等式を差し引きしてやると、
を仮定すれば
この2等式を差し引きしてやると、
最終的に、を仮定すれば
より
が出る。今回はが綺麗な形をしていたため、このように高校数学をやって出せば終わるが、 そうでない場合はberlekamp-masseyの根幹的なアイデアであるところの、母関数と漸化式の関係を考えて分母を出す必要がある(というより、一旦分かりやすい関数の積に分離+それぞれで高校数学+心温まる手筆算でそれらを合成みたいな感じになる)。
さて、を明示的に用いて導出を行ったのは、最終的な漸化式 が成立するためには、の連続する4項について、元の漸化式
が成立する必要があるということを明確にするためである。 すなわち、この問題の条件として存在している、「 は通ってはいけない」によって強制的に となっている付近では、 この4項間漸化式は成立しないことを意味する。 逆に、成立するためには直近の4項さえ元の漸化式を満たしていれば良い。 すなわち、それより以前の項がいくつ強制的に定数に書き換わっていても、この漸化式を用いて計算を行って良い。 したがって、 付近以外は行列累乗によって計算できることが分かり、後は 付近を項ごとに 程度で計算できれば良い。
さて、 付近については気合で求める。というのも、以下の等式自体は、を仮定するだけで言えるのであった:
すなわち、さえ成立していれば、を満たすは、およびの総和さえ保持しているだけで、で計算できる。 問題は、 を満たしていない時である。この時 となるわけであるが、
「仮にが成立していたとすると、 はいくつであったか」を求めることは上記の行列累乗ないし愚直な計算を用いて可能である。
これを とおく。
を用いれば、「仮に が成立していた時、 がいくつであったか」も求まる。
これを とおく。すると、元の漸化式を考えた時、 が成立する。よって、このケースにおいてもで計算できる。
さて、残った問題はおよびの総和を保持する必要が生じたこと。これによって行列累乗中でこれらの値についても計算する必要が出てくる。 これは †気合†でやればよい
全部できたので、オッケー
これ、解説の言い換えでやると多分こんな爆発ad-hocクソ面倒行列累乗にはならない気がしていて、 言い換えって大事なんだねーと思ってます。今
Open Problem
結局FPSで定式化しようとしたがうまくいかなかったので方針修正を行った結果かなり遠回しな解法になった。 実はFPSでもある程度までは綺麗な定式化が出来る。 今回はがなので最終的にはどうにもならないにしても、オーダーでFPSの操作だけで殴れたら嬉しいに決まっている。 あるいは、オーダーであっても、綺麗にFPSの操作で問題が記述できていれば、高校数学など手計算でちゃんと答えが求まる可能性もある。
困っているのは定式化すると最終的に出てくる方程式が解けないという点。 とりあえずこれについて書いておく。
まず問題を以下の様に一般化する:
まず、
とすれば、元の問題と同様に、の制約を無視すれば が可能な移動を表すFPS。 ここで、FPSの作用素(FPSからFPSの写像)を、「中の次の項のみ取り出す操作」として定義する。 作用素は明らかに線形性・冪等性などを持つ。今、 中に含まれる、「本来禁止されていたはずの経路のコスト」を引きたい。
このために、FPS を、
すなわち、
として定める。
は何を表してるかというと、
「回のジャンプであって、ぴったり回目で禁止された場所に移動してしまったもののコストの総和」
である。 これが分かると、は「回目のジャンプで初めて禁止された場所にきてしまった経路全体」を表すことになるので、 これの総和を取って、
が求めたい引くコスト全体。
定義式に基づいて、の具体的な値について考えてみると、
となっている。の線形性に気をつければ、これは、
となる。とおくと、
という方程式を満たすようなが求めたいという問題になる。 に気をつけると、
となり、を満たす(すなわち、次の項しか持たないような多項式の)中で、これが成立するようなを求めたくなる。
これは、とおくと、
なるを求めるのと同値であり、をそれぞれ求めて、係数をベクトルだと思うことにすると ある種の連立方程式であるということは分かる。 が、以下の解法があるのか、すなわち、を列ベクトルとしてもつような行列の逆行列が高速に求められるのかが謎.....
誰か、考えてみてね
追記:
なってない崎
— 精進 (@shojin_comp) December 16, 2019
B_iが等差数列みたいな制約があったら、divを使っていい感じで求められるということはわかった崎