尼姆博弈

问题描述 :

  有N堆物品,其中第 i 堆有 pi 个物品,每次从一堆中选出若干个物品去掉(但不能为 0 ),两人轮流取物品,谁不能取谁就输了,问什么情况下会先手必胜?

  

代码示例 :

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int n, x;
    
    while(~scanf("%d", &n)){
        int s = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d", &x);
            s ^= x;
        }
        if (s == 0) puts("No");
        else puts("Yes");
    }
    return 0;
}

尼姆博弈有几种经典的扩展形式

1 . 限定每次取物的上限

 问题 : 有 n 堆物品,其中第 i 堆有 pi 个物品,每次将去掉某一堆里最多的 m 个物品(m > 0),两人轮流取物品,谁不能取谁就输了

 结论 : 分别将 pi 对 m +1 取余,等到一组新的 pi 值,然后取将这组 pi值取异或,记结果为 s,若 s 为0,则为 p 局面,否则是 N局面

 证明 : 进行过上述操作后,可以得到两组数据,一组是新的 pi 值, 一组是 ri 值,表示 m+1 的整倍数,当先手这个人面对N居民,就按照Nim 的取法在pi 堆中取,当输的人如果在 ri 堆中取时,此时先手的人则在 ri 堆中选取 m+1-k 个即可。

东北日出西边雨 道是无情却有情
原文地址:https://www.cnblogs.com/ccut-ry/p/8997233.html