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

 

 

 

posted @ 2017-04-05 10:21 _rqy 阅读(...) 评论(...) 编辑 收藏