1. 程式人生 > >John 尼姆博弈

John 尼姆博弈

least air exti there with 經典的 args determine nes

John

Little John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that each player has to eat at least one M&M during his turn. If John (or his brother) will eat the last M&M from the box he will be considered as a looser and he will have to buy a new candy box.

Both of players are using optimal game strategy. John starts first always. You will be given information about M&Ms and your task is to determine a winner of such a beautiful game.

InputThe first line of input will contain a single integer T – the number of test cases. Next T pairs of lines will describe tests in a following format. The first line of each test will contain an integer N – the amount of different M&M colors in a box. Next line will contain N integers Ai, separated by spaces – amount of M&Ms of i-th color.


Constraints:
1 <= T <= 474,
1 <= N <= 47,
1 <= Ai <= 4747

OutputOutput T lines each of them containing information about game winner. Print “John” if John will win the game or “Brother” in other case.

Sample Input

2
3
3 5 1
1
1

Sample Output

John
Brother

對於N堆的糖,一種情況下是每堆都是1,那麽誰輸誰贏看堆數就知道;
對於不都是1的話,若這些堆是奇異局勢,或說他們是非奇異局勢,但非奇異局勢皆可以轉換到奇異局勢。

經典的尼姆問題是誰哪拿到最後一個則誰贏,本題是拿最後一個的輸。
下面分析第二種情況:
1.初始給的是奇異局勢的話,則先取者拿到最後一個為輸。
2.初始給的是非奇異局勢的話,則先取者為贏。
	對於任何奇異局勢(a,b,c),都有a^b^c=0(^是代表異或).
非奇異局勢(a,b,c)(a<b<c)轉換為奇異局勢,只需將c變成a^b,即從c中減去c-(a^b)即可

import java.util.*;

public class Main {
    
    static Scanner sc = new Scanner(System.in);
    
    public static void main(String[] args){
        
        int t, n, x, f, ans, i;
        t = sc.nextInt();
        while((t--) != 0){
            n = sc.nextInt();
            ans = 0; f = 0;
            for(i = 1; i <= n; i++){
                x = sc.nextInt();
                ans ^= x;
                if(x > 1) f = 1;
            }
            if(f == 0){
                if((n & 1) != 0) System.out.println("Brother");
                else System.out.println("John");
            }
            else{
                if(ans == 0) System.out.println("Brother");
                else System.out.println("John");
            }
        }
    }
}

John 尼姆博弈