Sherlock and Watson are playing the following modified version of Nim
game:
-
There are n piles of stones denoted aspiles0,piles1,...,pilesn-1, and n is a prime number;
-
Sherlock
always plays first, and Watson and he move in alternating turns. During
each turn, the current player must perform either of the following two
kinds of moves:
-
Choose one
pile and remove k(k >0) stones from it;
-
Remove k stones from all piles, where 1≤k≤the size of the smallest pile. This move becomes unavailable if any pile is
empty.
-
Each player
moves optimally, meaning they will not make a move that causes them to
lose if there are still any better or winning moves.
Giving the initial situation of each game, you
are required to figure out who will be the winner
The first contains an integer, g, denoting the number of games. The 2×g subsequent lines describe each game over two lines:
1. The first line contains a prime integer, n, denoting the number of piles.
2. The second line contains n space-separated
integers describing the respective values of piles0,piles1,...,pilesn-1.
-
1≤g≤15
-
2≤n≤30, where n is a prime.
-
1≤pilesi≤105 where 0≤i≤n?1
For each game, print the name of the winner on a new line (i.e., either “Sherlock”or “Watson”)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std ;
#define maxn 100
#define LL long long
LL num[maxn] ;
int main(){
int n ;
int t ;
scanf("%d" , &t) ;
while(t--){
scanf("%d" , &n) ;
for(int i=0 ; i<n ; i++){
scanf("%d" , &num[i]) ;
}
if(n==2){//威佐夫博弈
if(num[0] < num[1]){
swap(num[0],num[1]) ;
}
if((LL)((num[0]-num[1]) * (1.0 + sqrt(5.0))/2.0) == num[1]){
printf("Watson\n") ;
}else printf("Sherlock\n") ;
}
else {//NIM 游戏
LL k = num[0] ;
for(int i=1 ; i<n ; i++){
k = k ^ num[i] ;
}
if(k==0){
printf("Watson\n") ;
}else printf("Sherlock\n") ;
}
}
return 0 ;
}