bzoj1022: [SHOI2008]小约翰的游戏John

来源:互联网 发布:小米手环2 知乎 编辑:程序博客网 时间:2024/06/10 07:52

传送门

题目大意:反Nim游戏,即取走最后一个的人输

首先状态1:如果所有的堆都是1,那么堆数为偶先手必胜,否则先手必败

然后状态2:如果有两个堆数量相同且不为1,那么后手拥有控场能力,即:

若先手拿走一堆,那么后手可以选择将另一堆留下1个或者全拿走,使这两堆最终只剩1个或0个;

若先手将一堆拿剩一个,那么后手可以选择将另一堆留下一个让先手拿或全拿走,使这两堆最终只剩1个或0个;

若先手将一堆拿走一部分,那么后手可以将另一堆同样拿走一部分,然后同上

状态3:若Xor!=0 那么先手可以先拿走一部分让Xor=0 然后同状态2先手必胜 否则先手必败

鉴于本人智商余额严重不足,以上内容仅存在参考价值,无法证明正确性,欢迎指正

于是若所有堆全是1 Xor==0先手必胜 否则后手必胜

若有堆不是1 Xor==0后手必胜 否则先手必胜

var  t,i,j,n,sg,fl,x:longint;begin  read(t);  for i:=1 to t do begin    read(n); sg:=0; fl:=0;    for j:=1 to n do begin      read(x); sg:=sg xor x;      if (x<>1) then fl:=1;    end;    if (sg+fl=0) or ((sg<>0) and (fl<>0)) then writeln('John') else writeln('Brother');  end;end.



1 0