• SJ定理——省选前的学习2


    ——博弈论?上SG定理!什么?不行?那就SJ定理吧。

    原来还有这么个玩意。。。

    bzoj1022.

    大意是Nim取石子游戏中取到最后一个石子就算输,即无法取了就获胜(原版是无法取了就输)。

    我们试图套SG定理。。。$SG_0$=??

    比如我令SG[0]=1,那么问题来了:两堆石子,个数均为0,应该是先手必胜,但$SG_0 oplus SG_0 = 0$,所以不合法。

    SJ定理:

    若把SG游戏中的空状态定义为必胜状态,那么状态是先手必胜当且仅当下述条件同时成立或同时不成立:

    1: $SG_S = 0$

    2: $forall x in S  ; SG_x leq 1$

    其中,$SG_S$是状态的SG值,$SG_x$是各子问题的SG值。

     

    证明(不想看请跳过):

    首先,终止状态由于满足两个条件,所以必胜。

     

    其次,证明必败态的后继全是必胜态:

    1:若满足条件1而不满足2,那么$SG$值大于$1$的一定不止一个(因为异或中小于等于$1$的之会影响最后一位,所以前面所有位必须有至少两个数,即至少有两个数大于$1$),那么,进行一步后$SG$值一定非零,且还是有大于$1$的,即两条件都不满足。

    2:若满足条件2而不满足条件1,可以发现现在一定只有奇数个$1$和若干$0$。那么现在有两种可能:

      (1)将一个$1$变成$0$,或将一个$0$变成$1$(注意,$SG$值可以变大,但不会不变),那么条件1得到满足,且条件2仍满足,即为必胜态;

      (2)将一个数变得大于$1$。此时可发现$SG$值异或和必不为$0$,所以两条件都不满足,为必胜态。

     

    最后,证明必胜态至少有一个后继是必败态:

    1:若两条件都满足,那么必有偶数个$1$和若干$0$,此时只需要将一个$1$变成$0$,就会使条件1不满足。

    2:若两条件都不满足,那么:

      (1)若只有一个数大于$1$,那么将其变为$0$和变为$1$都会满足条件2,且必有一个选择使$SG$值不为$0$,即为必败态;

      (2)否则,后继必不满足条件2,此时类似于SG定理,必定能使$SG$值变为0,即为必败态。

    证毕。

     

    附AC代码:

     

     1 #include <cstdio>
     2 int main() {
     3   int T, n, x, y, t;
     4   for (scanf("%d", &T); T; --T) {
     5     for (scanf("%d", &n), y = t = 0; n; --n) {
     6       scanf("%d", &x);
     7       y ^= x;
     8       t |= x > 1;
     9     }
    10     puts((!!y ^ t) ? "Brother" : "John");
    11   }
    12   return 0;
    13 }
    View Code

     

     

  • 相关阅读:
    Python加载声音
    Python 的文件处理
    java学习总结
    Fiddler二次开发 C#
    开发工具 快捷键
    linux / shell /adb
    Java堆栈
    selenium获取接口 HAR
    服务端通过socket向安卓客户端发送shell
    设计模式
  • 原文地址:https://www.cnblogs.com/y-clever/p/6667592.html
Copyright © 2020-2023  润新知