公式

Ex - General General 解説 by m_99


\(i=x\) として行う操作を 操作 \(x\) と呼ぶことにします。

操作方法の絞り込み

操作方法として考慮するのは以下の条件を満たす場合のみで十分です。

  1. \(1\) 回以上使う操作が \(2\) 種類以下である
  2. \(1\) 回以上使う操作が \(3\) 種類で、そのうち \(2\) つは操作 \(2,4,6,8\) のいずれか、残る \(1\) つは操作 \(1,3,5,7\) のいずれかかつ後者を使う回数は \(1\)
証明 上記 $2$ つの条件に当てはまらないような操作方法は、操作回数を増やさずに上記 $2$ つに当てはまるようにできることを示します。 まず、使う操作が $3$ 種類の場合をそれぞれ以下に示します。(反転や回転によって一致するものや、操作 $1,5$ のように正反対の向きへの移動をともに使っているようなものは省いています)
  • 操作 $1,2,3$ を使う場合、操作 $1,3$ を $1$ 減らして操作 $2$ の回数を $1$ 増やすことで操作回数を増やさずに同じ操作結果を得られます。これを操作 $1,3$ の回数が $0$ になるまで繰り返すことで使う操作を $2$ 種類以下に出来ます。
  • 操作 $1,2,4$ を使い、かつ操作 $1$ を $2$ 回以上使う場合、操作 $1$ を $2$ 回減らし、操作 $2$ を$1$ 回増やし、操作 $4$ を $1$ 回減らすことで操作回数を増やさずに同じ操作結果を得られます。これを操作 $1$ の回数が $1$ 以下になるまで繰り返すことで条件を満たすことが出来ます。
  • 操作 $1,2,7$ を使う場合、操作 $1$ を $1$ 回増やして操作 $2,7$ を $1$ 回減らせば良いです。
  • 操作 $1,2,8$ を使う場合、操作 $1$ を $2$ 回減らして操作 $2,8$ を $1$ 回増やせば良いです。
  • 操作 $1,3,6$ を使う場合、操作 $1,3,6$ を $1$ 回減らせば良いです。
  • 操作 $1,4,6$ を使う場合、操作 $1$ を $2$ 回減らして操作 $4,6$ を$1$ 回増やせば良いです。
  • 操作が $4$ 種類以上の場合、正反対の向きの操作は同時に使わないとできることから操作 $2,4,6,8$ から選ばれるものは高々 $2$ つとなり、それゆえに少なくとも $2$ つは操作 $1,3,5,7$ となります。これらのうち $2$ つと任意の $1$ つを選ぶと上述の議論より使う操作を $1$ つ減らすことが出来ます。

    対称性等の利用

    条件の \(2\) 番目では使う操作が \(3\) 種類とありますが、そのうち \(1\) つは使う回数が \(1\) 回です。よって、操作 \(1,3,5,7\) のうち \(1\) 回使うものを全探索することで使う操作が \(2\) 種類以下である場合のみが分かれば良くなります。
    使う操作が \(2\) 種類以下の場合ですが、対称性を利用することでいくらか簡単に網羅することが出来ます。\((A',B') = (B,-A), s'=s_3s_4s_5s_6s_7s_8s_1s_2\) とすると、目標となる移動先と操作の向きをそれぞれ \(90\) 度回転させたことになります。これを利用して\(0,90,180,270\) 度回転させた場合それぞれについて調べることにすると、以下の \(9\) つの場合を調べれば十分となります。

    • 操作をしない場合
    • 操作 \(1\) のみを使う場合
    • 操作 \(2\) のみを使う場合
    • 操作 \(1,2\) を使う場合
    • 操作 \(1,3\) を使う場合
    • 操作 \(1,4\) を使う場合
    • 操作 \(1,6\) を使う場合
    • 操作 \(1,8\) を使う場合
    • 操作 \(2,4\) を使う場合

    お好みで、上下反転した場合も考えることで\(4\) 番目と \(8\) 番目、\(6\) 番目と \(7\) 番目を一致させても良いかもしれません。

    別解

    \(\mathrm{dp}_{i,j,k}\) を、操作 \(1,2,\ldots,8\) を使う回数の \(2^0, 2^1, \ldots, 2^i\) の位を決めていて、 \(x\) 座標/ \(y\) 座標における繰上り/繰り下がりが \(j\) / \(k\) であるような場合の操作回数の最小値とします。この \(\mathrm{dp}\) は、遷移を前計算しておくことにすると \(1\) ケースでは \(\log A \times 7 \times 7\) 個の状態から最大で \(37\) 種類の遷移を行うことになり、\(T=10^4\) ではおよそ \(6 \times 10^8\) ステップ程度と見積もれます。これは多くの問題の想定解におけるステップ数と比べて大きめですが、実際、\(1\) 秒未満で動作します。
    実装等に依存する定数倍によって実行時間制限に間に合わない可能性を考慮すると、最悪ケースが \(s_1s_2s_3s_4s_5s_6s_7s_8=\) 11111111 であることがほとんど明らかなことを利用し、コードテストで間に合うことを確認してから提出するのが安全でしょう。

    投稿日時:
    最終更新: