2019年7月22日月曜日

AGC 036 B - Do Not Duplicate

AGC 036 B - Do Not Duplicate

ssを操作していく中で、ssの先頭の数と同じ数が現れたとき、またその時に限ってすべての数が消えることに注目する。

数列A:=(3,2,4,3,4,1)A := (3, 2, 4, 3, 4, 1)を例にとって考える。ssの先頭がA0(=3)A_0(=3)である場合、A1(=2)A_1(=2)である場合、…のnn通りについて、AAを右にひとつつなげた時に、数が全部消えて次に始まる位置を考える:

  • 3 2 4 3 4 1 | 3 2 4 3 4 1
  • X 2 4 3 4 1 | 3 2 4 3 4 1
  • X X 4 3 4 1 | 3 2 4 3 4 1
  • X X X 3 4 1 | 3 2 4 3 4 1
  • X X X X 4 1 | 3 2 4 3 4 1
  • X X X X X 1 | 3 2 4 3 4 1

つまり、AAをひとつ追加すると先頭の位置は

031226314356 0 \mapsto 3 \\ 1 \mapsto 2 \\ 2 \mapsto 6 \\ 3 \mapsto 1 \\ 4 \mapsto 3 \\ 5 \mapsto 6

と変化していることになる。ここで位置66が登場しているが、つまり、先頭が存在しない場合も扱う必要があった。すなわち

  • X X X X X X | 3 2 4 3 4 1

も追加して

031226314356600 \mapsto 3 \\ 1 \mapsto 2 \\ 2 \mapsto 6 \\ 3 \mapsto 1 \\ 4 \mapsto 3 \\ 5 \mapsto 6 \\ 6 \mapsto 0

が完全な対応である。この写像をK1K-1回合成すれば、そこからはシミュレーションで間に合う。合成にはダブリングが使える。


開始位置をnn通りではなくてn+1n+1通り考える必要がある、という部分を明確にできなくてコンテスト中には書けなかった。

あと、写像を作る部分をO(N){\mathcal O}(N)で実装するのに時間がかかった。こういうのは問題数をこなすしかなさそう。