题目链接:
题意:n堆石子,两人轮流操作,每次操作只能选定其中一堆,并取走若干个(>=1个)。谁取走最后一个石子谁输。给定一个状态,问先取的赢还是后取的赢。
思路:结论:
(1)所有堆的石子均为1且SG为0,先手必胜;
(2)有些堆的石子大于1且SG不为0,先手必胜。
(3)所有堆的石子均为1且SG不为0,后手必胜;
(4)有些堆的石子大于1且SG为0,后手必胜。
证明:(1)的下一个状态必为(3);(2)分两种情况,第一种大于1的堆数等于1,则下一个状态为(3)否则下一个状态为(4);(3)的下一个状态为(1),(4)的下一个状态为(2)。也就是说,必胜态总有下一个状态为必败态;必败态的下一个状态必为必胜态。
#include#include using namespace std;int C;int n;int main(){ for(scanf("%d",&C);C--;) { scanf("%d",&n); int i,flag=0,ans=0,x; for(i=1;i<=n;i++) { scanf("%d",&x); if(x>1) flag=1; ans^=x; } if(!flag&&!ans||flag&&ans) puts("John"); else puts("Brother"); } return 0;}