Codeforces Round #308 Div2 C: Vanya and Scales

問題

codeforces.com

解法

天秤が釣り合う時、m+w^a+w^b+...=w^p+w^q+...となる。この時、m=w^p+w^q+...-(w^a+w^b+...)と書ける。
mをwで割り切れる限り割り続けると、 m=w^c+...+1または m=w^c+...-1というように、あまり1か-1になる。つまりmがwで割り切れる時は割り続け、割り切れなくなったら1を足すか引くかして、それでも割り切れなかったら釣り合わない、最終的にm=1となる時は釣り合う、ということが出来る。

コード

import java.util.Scanner;

public class Main {

	public void solve() {
		Scanner sc = new Scanner(System.in);
		long W = sc.nextLong();
		long M = sc.nextLong();
		sc.close();
		int cur = 0;
		while (Math.pow(W, cur) < M) {
			cur++;
		}
		if (Math.pow(W, cur) == M) {
			System.out.println("YES");
			return;
		}

		if (saiki(W, M)) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	}

	private boolean saiki(long W, long M) {
		if (M == 1) {
			return true;
		}
		if (M % W == 0) {
			return saiki(W, M / W);
		} else if ((M - 1) % W == 0) {
			return saiki(W, (M - 1) / W);
		} else if ((M + 1) % W == 0) {
			return saiki(W, (M + 1) / W);
		}
		return false;
	}

	public static void main(String[] args) {
		new Main().solve();
	}
}