取(m堆)石子游戏 HDU - 2176
尼姆博弈:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。
结论:把每堆物品数全部异或,如果得到的值为0,那么先手必败,否则先手必胜。
AC代码如下:
#include<iostream>
using namespace std;
int a[200010];
int main()
{
int n, k;
while (cin >> n)
{
if (n == 0)
break;
int temp = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
temp ^= a[i];
}
if (temp == 0)
cout << "No" << endl;
else
{
cout << "Yes" << endl;
for (int j = 0; j < n; j++)
{
k = temp ^ a[j];
if (k < a[j])
cout << a[j] <<" "<< k << endl;
}
}
}
return 0;
}