TopCoder SRM 604 Div1 Easy PowerOfThree
問題
ロボットが座標平面の原点にいる。
好きな歩数を動くことができて、i歩目の移動では上下左右のいずれかの方向に、3^iだけ移動する。
ただし途中の移動だけをスキップすることはできない。
ロボットが座標(x, y)で止まることができるかを判定せよ。
制約条件
x, yの絶対値≦10億
方針
まずx, yは絶対値を取って正にしてしまってよい。
で、x, yを3進法で下の桁から見ていく。
下の桁が両方が0(で、x, yが0でない)なら不可能。
どっちも0でない場合も不可能。
一方が1または2で、1のときはその方向に移動するしかない。
2のときは逆方向に移動するしかない。
これを繰り返してx, yを両方0に出来れば止まれるといえる。
ソースコード
class PowerOfThree { public: string ableToGet(int x, int y) { x = abs(x); y = abs(y); while(x > 0 || y > 0){ if(x % 3 && y % 3 || x % 3 == 0 && y % 3 == 0) return "Impossible"; if(x % 3 == 2) x /= 3, x++; else x /= 3; if(y % 3 == 2) y /= 3, y++; else y /= 3; } return "Possible"; } };