こちらもコードは短い。
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だけ特別扱いなの何なんだろうな。