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";
	}
};