Anti-Nim博弈,最后取完就为输。
定义:P=各堆异或值和为0,N各堆异或值和不为0.
1代表所有堆中只有一堆充裕堆(数量>=2) ,2代表所有堆中超过一个充裕堆 ,0代表无充裕堆(即是所有堆皆为1)
堆中数量为1称为孤单堆
有以下结论:
1:) P1,P2,N0状态为必胜。
2:) N2,P0状态为必输。
证明:转载
我翻了很多博客都直接说完这个理论就直接贴代码。。。但是此题他可以将(数量大于2的一堆分为一堆或两堆)
但是为什么一样可以套以上的结论呢
因为将数量大于2的一堆分为两堆,一样会从N2向P1或P2转化。
例如(原堆为1101,分为两堆1000,0101),现在要在这两堆之一减去一定数量,必定会导致这两堆的异或值和,不等于1101的异或值,
所有最终所有堆的异或和一定从N变为P,但N2不能转P0,所以N2必定向P1或P2转化。
理解后代码就好写了
核心代码如下:
while (scanf("%d", &n) == 1) {
int Xor = 0,num=0;
fora(i, 0, n - 1) {
sci(a[i]);
Xor ^= a[i];
if (a[i] > 1) num++;
}
if (Xor&&num || !Xor && !num)
printf("Yes\n");
else
printf("No\n");
}