巴什博奕 尼姆博弈

巴什博奕:

只有一堆n个物品,每次至少取a个,最多取b个

问题可分为
1.最后取完者胜 (面临(a+b) * k个物品的人必败)
2.最后取完者败 (面临(a+b) * k+a个物品的人必败)
因此当两个都极其聪明的人博弈时,就看有多少个物品,自己先手取了之后能否让对手面临必败点

对于最后取完者胜的情况
对取物品方面又可分为
①最后当物品数小于a的数量就不能再取了
②最后当物品数小于a的数量还能再取最后一次
通过考虑 总物品数 n=(a+b)*k+c 通过c的范围来判断是先手胜还是后手胜
若是情况①,先手的目的就是想给对手留下(a+b)*k个物品
(1) 当c==0时 ,即n=(a+b)*c时,先手没办法给对手留下(a+b)*k个物品,后手胜
(2) 当1<=c<a时,由于剩小于a个物品时谁也取不了,无论先手怎样取,后手只需要与他取的和为(a+b),最后先手面临无法取的状态,后手胜
(3) 当a<=c<=b时,由于先手可直接拿走c,让对手面临(a+b)*k个物品,先手胜
(4) 当b<c<a+b时,先手取完之后相当于让对手面临第(2)种情况,先手胜

若是情况②,先手的目的也是想给对手留下(a+b)*k个物品
(1) 当c==0时 ,即n=(a+b)*c时,先手没办法给对手留下(a+b)*k个物品,后手胜
(2) 当1<=c<a时,由于最后剩小于a个物品可以一下取完,先手胜
(3) 当a<=c<=b时,由于先手可直接拿走c,让对手面临(a+b)*k个物品,先手胜
(4) 当b<c<a+b时,由于先手拿过之后就相当于对手面临第(2)或第(3)情况,后手胜

对于最后取完者败的情况
对取物品方面又可分为
①最后当物品数小于a的数量就不能再取了
②最后当物品数小于a的数量还能再取最后一次
通过考虑 总物品数 n-a=(a+b)*k+c 通过c的范围来判断是先手胜还是后手胜
只需要将最后取完者胜讨论的情况中的n换为n-a即可,讨论的c的范围与结论都一样

这类题目就是通过判断总物品数来判断先手胜还是后手胜

尼姆博奕

有若干堆一定数量物品,两人依次从任意堆中拿任意数量物品,每次至少取1个,面临奇异局势的人必败

**奇异局势:**所有堆的异或和为0
若当前不是奇异局势状态,如何将他变成奇异局势状态?有多少种方案数?
先算出当前所有堆的异或和值sum,再用这个值与每一堆的值进行异或,如
令 res=x1(+)sum 由公式 a(+)b(+)c(+)c = a(+)b
因此res就是除了x1那一堆其余所有堆的异或和,因此只需要在x1>res的前提下
将x1堆的值减到res即可(res(+)res=0)。所以,这就得到了一种方案,通过遍历所有的堆,当x>res时就是一种方案,最终可求得总方案数

例题:洛谷p1247取火柴游戏
代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long 
using namespace std;
int main()
{
		int a[500001],n,u,v;
		int sum=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			sum^=a[i];
		}
		if(sum==0)//如果异或和为0,说明先手面临奇异局势,必败
		printf("lose\n");
		else//如果异或和不为0,则先手想通过改变某一堆的数量让局面变为奇异局势
		{
			int ans;
			for(int i=0;i<n;i++)//遍历a[0]-a[n-1]
			{
				ans=a[i]^sum;//此处得到的是除了a[i]堆以外的其余堆异或和
				if(a[i]>ans)//若该堆数量大于ans  则只需将其数量变为ans就得到了一种方案
				{
					u=i;
					v=a[i]-ans;
					a[i]=ans;
					break;
				}
			}
			printf("%d %d\n",v,u+1);
			for(int i=0;i<n-1;i++)
			printf("%d ",a[i]);
			printf("%d\n",a[n-1]);
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henulmh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值