[笔记] 巴什博弈
[笔记] 巴什博弈
Define
巴什博弈是最简单的一种博弈,定义如下
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
必胜态\(N\)和必败态\(P\)
- 所有必胜态\(N\)肯定有一种方法转移到必败态\(P\)
- 必败态\(P\)无论怎么转移,都会转移到必胜态\(N\)(下一手必胜)
- 所有终结点是必败态\(P\)
分析必胜态\(N\)和必败态\(P\)都是以终结点开始进行逆序分析
Analyze
对于必胜态\(N\)和必败态\(P\)的分析
现在如果一共有\(m+1\)个物品,我们去取它,先手至少要取一个,却又把所有的物品取不完,这样就导致了后手的必赢
如果物品数小于等于能取的数目,是必胜的,因为只用取一次,如果是大于能取的数目的,我们可以把总数\(n\)分解为\((m+1)∗x+r\)
显然对于\((m+1)∗x+r\)个数,如果我们先手,只需要取走\(r\)个数,然后留\((m+1)∗x\)给对方,这样一来,每次对方取一个数\(y\)我们就只需要取\(m+1−y\)个就可以了,也就是说每一个\(m+1\)的最后一个都是最开始的先手取的,这样就能保证如果是可以分解为\((m+1)∗x+r\)的话,先手必胜,如果只能分解为\((m+1)∗x\)的话,先手必败
Code
[HDU2846] Brave Game
#include <iostream>
#include <cstdio>
#define sc(x) scanf("%d", &x);
using namespace std;
int main(){
int t, n, m;
sc(t);
while(t--){
sc(n);
sc(m);
if(n % (m + 1) == 0)
printf("second\n");
else
printf("first\n");
}
return 0;
}