TopCoder SRM 664 Div1 Easy: BearPlays

解法

式を書いてみると、K回目の操作が終わった後、Aの山の方は石の数が  A \times 2^K mod (A+B)となっている。それを計算し、小さい方を返せば良い。

コード

import java.math.BigInteger;

public class BearPlays {

	public int pileSize(int A, int B, int K) {
		long S = A + B;
		BigInteger aInteger = new BigInteger("2");
		BigInteger kInteger = new BigInteger(String.valueOf(K));
		BigInteger ansInteger = aInteger.modPow(kInteger,
				new BigInteger(String.valueOf(S)));

		long ans1 = ansInteger.longValue();
		ans1 %= S;
		ans1 *= A;
		ans1 %= S;
		long ans2 = S - ans1;

		return (int) Math.min(ans1, ans2);
	}

}