説明
リトルジョンと彼の兄弟、しばしば非常に面白いゲームをプレイ:テーブルの上に石のn個のヒープがあり、リトルジョンと彼の兄弟テイクは石に変わり、一人一人にかかる
時間は、結石のこの山に取るために、石の山を選択することができますなど、多くの石を取るが、あなたは石を取らないことができない、我々は最終的に取る必要が
失われたと考え李石の人々を。ジョンは非常に頑固で、スマートに弟ながら、彼は人々が大きな利点を取られ得ることを主張したので、彼はいつも石を取る
より、彼はゲームでミスを犯したことはありません。あなたは彼のスタッフを行う前に、ジョン・ムッ。もちろん、あなたが予想するプログラム書くべき
試合に勝つだろう誰を。
入力
データセットによって入力されたタイトルが整数Tからなる最初の行を含み、Tは、入力されたデータセット(T≤500)の合計を表します。各データ・パケットの最初の行は
、整数N(N≦50)を備え、Nは整数Nと5000以下で、その後、石のヒープの合計を示し、石の各山の数を表します。
出力
各データ出力のための一つの列、1行に1つの単語の出力。ジョンは試合に勝つことができた場合は、出力「ジョン」、それ以外の場合は出力「ブラザー」は
、例の単語がありますのでご注意ください。
サンプル入力
2
3
3 5 1
1
1
サンプル出力
ジョン・
ブラザー
序文
定義\(MEX \)値は、関数がセットに属さない\(S \) :すなわち、最小の非負整数、
[MEX(S)=分\ lbrace X \ rbrace(X \ S notin、X \ N \で)\]
、例えば、\(MEX(\ lbrace 0,2,4 \ rbrace)= 1 \) 。状態に関しては\(X \)と、すべての\(K \)の後継番目述べて\(Y_1、Y_2、...、y_n \) 、の定義\(SG \)機能:
[SG(X)= MEX \ \ lbraceのSG(Y_1)、SG(
Y_2)、... SG(y_n)\ rbrace \] ゲーム図のSG値が含まれている各サブ関数の同じ又は異なるSGとゲーム機能値を有する、すなわち:
\ [SG(G)は、SG(= G_1)\ bigoplus SG(G_2)\ bigoplus ... \ SG bigoplus(G_N)\]を
レポートの問題解決
私たちは、最初に、残りの瓦礫の石のケースを考える番号1です。逆に状態を失うこの場合瓦礫の奇数(SG値XOR 1 =奇数= 1)は、状態勝つ(SG値= 0)の数である場合、偶数の瓦礫。
以降SG値は、この時点で0に等しくない場合、ヒープの少なくとも二つの瓦礫石の存在の残り数が1より大きい場合\(SG(G)はSG = (G_1)\ bigoplus SG(G_2)\ bigoplus ... \ bigoplusのSG(G_N)\) 、提供\(SG(G)\)石のk番目のビットで最上位ビットのバイナリ表現の、あなたは少なくともパイル\(SG(G_i)\) 、その最初のkビットが1です。明らかに\(X-bigoplus <SG(G_i)\ \ SG(G_i)) 、から私たちの最初の\(私は\)に相当石のいくつかのヒープ、削除(X- \ bigoplus SG(G_i)\)\を、および\(X \)= 0 \ X- bigoplus。だから我々は合計されます石の山に石の数を奪うことができます\(SGの\を)値がゼロになります。
1より大きい石の場合にのみ山、そしてちょうど瓦礫の合計数は、完全な1が奇数になっ作ることができます。
結論
石の瓦礫の残り数が1の場合1は、合計値が0 SGの勝利に等しいです。
図2は、瓦礫石の残数が1よりも長い時間を有する場合、合計値が1つのSGの勝利よりも大きいです。
コード
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5+10;
int main(){
int T;
cin>>T;
while(T--)
{
int n,x,ans=0;
cin>>n;
int flag=1;
for(int i=1;i<=n;i++)
{
cin>>x;
ans^=x;
if(x!=1)
flag=0;
}
if((flag&&!ans)||(!flag&&ans))
{
printf("John\n");
}
else
printf("Brother\n");
}
return 0;
}
参考資料
https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html
https://oi-wiki.org/math/game-theory/