[BZOJ 1022] [SHOI2008]ジョン・リトルジョンのゲーム

説明

リトルジョンと彼の兄弟、しばしば非常に面白いゲームをプレイ:テーブルの上に石の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/

おすすめ

転載: www.cnblogs.com/hh13579/p/11729953.html