问题描述 :
有N堆物品,其中第 i 堆有 pi 个物品,每次从一堆中选出若干个物品去掉(但不能为 0 ),两人轮流取物品,谁不能取谁就输了,问什么情况下会先手必胜?
代码示例 :
int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); int n, x; while(~scanf("%d", &n)){ int s = 0; for(int i = 1; i <= n; i++){ scanf("%d", &x); s ^= x; } if (s == 0) puts("No"); else puts("Yes"); } return 0; }
尼姆博弈有几种经典的扩展形式
1 . 限定每次取物的上限
问题 : 有 n 堆物品,其中第 i 堆有 pi 个物品,每次将去掉某一堆里最多的 m 个物品(m > 0),两人轮流取物品,谁不能取谁就输了
结论 : 分别将 pi 对 m +1 取余,等到一组新的 pi 值,然后取将这组 pi值取异或,记结果为 s,若 s 为0,则为 p 局面,否则是 N局面
证明 : 进行过上述操作后,可以得到两组数据,一组是新的 pi 值, 一组是 ri 值,表示 m+1 的整倍数,当先手这个人面对N居民,就按照Nim 的取法在pi 堆中取,当输的人如果在 ri 堆中取时,此时先手的人则在 ri 堆中选取 m+1-k 个即可。