洛谷 P1247 取火柴游戏 题解

版权声明:随便转载。 https://blog.csdn.net/zhang14369/article/details/80335515

作者:岸芷汀兰

一、题目:

洛谷原题

二、思路:

这可能是博弈论最简单的题了。
在这里,只简单的唠叨几句。

定理:
NIM博弈先手必胜,当且仅当A1 xor A2 xor A3 xor … xor An ≠0。

证明略。

三、代码:

//写得太丑
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
inline int read(void){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return f*x;
}

const int maxn=500005;

int n,a[maxn];

int main(){
    n=read();
    for(register int i=1;i<=n;i++){
        a[i]=read();
    }
    int ans=0;
    for(register int i=1;i<=n;i++){
        ans^=a[i];
    }
    if(!ans){puts("lose");return 0;}
    int k;
    for(register int i=31;i>=0;i--){
        if((ans>>i)&1){k=i;break;}
    }
    for(register int i=1;i<=n;i++){
        if((a[i]>>k)&1){
            int temp=a[i]^ans;
            printf("%d %d\n",a[i]-temp,i);
            for(register int j=1;j<=n;j++){
                if(i==j){printf("%d ",temp);continue;}
                printf("%d ",a[j]);
            }
            puts("");
            break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhang14369/article/details/80335515