ABC108-D:Robot Arms
問題
https://beta.atcoder.jp/contests/abc111/tasks/arc103_b
制約
考え方
必要条件を考える
まず、構成するための必要条件を考える。 つの腕を定めたときに つの点が同時に到達できないといけない。これはそれぞれの点の距離 についてその偶奇が一致していないといけない。偶奇が一致していれば、十分な数の距離 の腕を使えば構成できることはわかる。
構成方法を考える
原点から に到達するように を定めないといけない。使える腕の数が と小さいので工夫して構成する必要がある。
「任意の数を作る」ときに 冪で構成することはよく知られている。 の腕を使って を作ることができる。
さて、難しいのは を同時に到達するようにモードを定めることである。これは実は座標を 度変換することで解決できる。
として 座標で考えることとすると、モードによる操作は以下のように変換されることがわかる。
変換された後の操作は、ある操作で のそれぞれについて同時に座標を加減することができる。そうすると後は、 冪で構成された腕の長さの長い腕( )から貪欲に当てはまるモードを設定すれば良い。なお から原点への移動方法を考えるがモードの設定は移動の方向と逆向きのモードを設定する。
の腕を用いる場合は任意の奇数のみを構成できるが、偶数の場合は長さ の腕を加えれば良い。
Submission #3766414 - AtCoder Beginner Contest 111
どこに着目して考察するべきだったか
任意の数を効率よく構成する方法は 冪で考えることである。加えて、 座標上の 変数に対して同時に操作したい場合は、座標変換して 座標上で考えるとうまくいくかもしれない。
何がバグっていたか
得た知見
- 冪で構成
- 座標変換(45度回転)