BZOJ 1022 [SHOI2008]小约翰的游戏John

来源:互联网 发布:杭州师范大学知乎 编辑:程序博客网 时间:2024/06/10 06:30

本题与Nim游戏相反,无法移动的人获胜。

分类讨论:

·记 SG = a1^a2^…^an

(1)每一堆石子的数量都是1:
·若石子的堆数为偶数,先手必胜
·若石子的堆数为奇数,先手必败

(2)至少存在一堆石子的数量大于1:

该情况下,一定存在某一步操作使得当前局面从上述情况(2)变为上述情况(1),即一步将最后一堆大于1的石子变为0或1的操作。记操作前的局面为A,操作后的局面为B。A->B过程中,操作可以选择将这堆石子变为0或1。

根据Nim游戏的定义,本题中,可以令SG≠0代表先手必胜(考虑将A->B时最后一堆石子的变化改为令自己在本题中的条件下失败,则恰好符合Nim游戏定义,故相反可行)。

必胜局面SG≠0,胜者可以通过移动使传递给败者的局面SG=0。而败者局面SG=0,必定会将SG≠0的局面传递给胜者。不断循环,可知SG≠0时必胜。

·若SG≠0,先手必胜
·若SG=0,先手必败

#include<cstdio>int main(){    int T;    scanf("%d",&T);    while(T--)    {        int n, x, SG=0;        bool allone=1;        scanf("%d",&n);        for(int i = 1; i <= n; i++)        {            scanf("%d",&x);            SG^=x;            if(x!=1)allone=0;         }        if(!allone && SG!=0 || allone && !SG)puts("John");        else puts("Brother");    }}
1 0