洛谷 P1247 取火柴游戏(nim 游戏)

 

 

简单说一下 nim游戏 的博弈原理,先将 a[i] 转化成二进制数,那么题目变成了每一次可以取走任意 a[i] 的 任意个 1

sum 是所有 a[i] 的异或值

如果 sum=0,说明有偶数个 1,先手拿 x,后手也拿 x,先手必败

如果 sum!=0,我们考虑去掉一堆,这 n-1 堆相互异或得到的结果 res,剩下的那一堆为 x,如果 x>res,那么我们考虑将拿掉 x-res,那么剩下的那一堆与其余的 n-1 堆形成异或为 0 的必败局面,可以证明一定存在 x 使得 sum!=0 时成立

const int N=5e5+5;

    int n,m;
    int i,j,k;
    ll a[N];

void Print(int pos,ll x)
{
	for(int i=1;i<=n;i++){
		if(i==pos) printf("%lld ",x);
		else printf("%lld ",a[i]);
	}
}

int main()
{
	while(~sd(n)){
		ll sum=0;
		for(int i=1;i<=n;i++) sd(a[i]),sum^=a[i];
		if(!sum) puts("lose");
		else{
			for(int i=1;i<=n;i++){
				ll res=sum^a[i];
				if(a[i]>res){
					printf("%lld %d\n",a[i]-res,i);
					Print(i,res);
					break;
				}
			}
		}
	}
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页