kmjp's blog

競技プログラミング参加記です

TopCoder SRM 848 : Div1 Medium PowerfulGame

こちらもコードは短い。
https://community.topcoder.com/stat?c=problem_statement&pm=18087

問題

整数A,B,Kが与えられる。
N=B-A-1個の石の山がある。
各山はA~Bの番号を持ち、i番の山は2^i個の石がある。

ここで以下の2人ターン制ゲームを行う。

  • 自分の手番では、石が1個以上ある山をK個選び、それぞれ石を取り除く。自分の手番で取り除けない場合負けとなる。

先手が必勝か判定し、必勝なら初手を1つしめせ。

解法

Aが0かどうかで必勝か決まる。
Aが1以上の場合必敗。というのも全山偶数個の石があるので、後手が先手の真似をすると後手必勝になる。
Aが0の時、先手は0番の他石の多い順に(K-1)個の山を選ぶとよい。

class PowerfulGame {
	public:
	vector <int> solve(int A, int B, int K) {
		if(A!=0) return {-2};
		if(B<=7||(B==47&&K==42)) {
			vector<int> C={0};
			int i;
			FOR(i,K-1) C.push_back(B-i);
			sort(ALL(C));
			return C;
		}
		return {-1};
	}
}

まとめ

B=47、K=42だけ特別扱いなの何なんだろうな。