「AcWing学习记录」博弈论

AcWing 891. Nim游戏

原题链接

定理: Nim博弈先手必胜,当且仅当

a1a2an!=0

问题1:当没有石子可拿的时候异或值为0,即

000=0

问题2:当面临异或值不为0的局面时,一定可以从某堆石子中拿走一部分使剩下的石子异或值为0。

a1a2an=x!=0

假设x的二进制表示中最高一位1在第k位,那么a1~an中必然存在一个数ai的第k位是1,且 aix<ai
又因为

ai(ai(aix))=aix

a1a2aixai+1an=xx=0

所以当从第i堆石子中拿走ai(aix)个石子时,可以使剩下的石子异或值为0。
问题3:当面临异或值为0的局面时,如果拿走一部分石子,一定会使剩下的石子异或值不为0。
利用反证法证明,假设当a1a2an=0时,拿走一部分石子,剩下的石子异或值仍为0。
ai为第i堆石子原本的石子数,ai为拿走一部分石子后第i堆石子的石子数,则有

a1a2aiai+1an=0

a1a2aiai+1an=0

将上下等式左右两边异或起来,有aiai=0,即 ai=ai,说明拿走前与拿走后的石子数相等,这与假设不相符,原命题成立。

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    int res = 0;

    scanf("%d", &n);
    while(n--)
    {
        int x;
        scanf("%d", &x);
        res ^= x;
    }

    if(res) puts("Yes");
    else puts("No");

    return 0;
}

AcWing 892. 台阶-Nim游戏

原题链接


AcWing 893. 集合-Nim游戏

原题链接


AcWing 894. 拆分-Nim游戏

原题链接


posted @   恺雯  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示