</pre><pre name="code" class="cpp">/*
这是尼姆博弈题
题目要求输出所有第一次取某堆的数量和剩下的数量
如果用常规的方法做的话,肯定会超时
所以我们必须要知道位运算的一个重要的性质,那就是:
a^b^c^d=e; d^e=a^b^c
*/
#include<iostream>
using namespace std;
int num[200002];
int main()
{
int m;
while(cin >> m && m)
{
int t = 0;
for(int i = 1; i <= m; i++)
{
cin >> num[i];
t ^= num[i];
}
if(!t) cout << "No" << endl;//判断如果是必败的情况直接输出No
else
{
cout << "Yes" << endl;
for(int i = 1; i <= m; i++)
if((num[i]^t) < num[i])//由于运算符优先级的问题,所以位运算在这里要加上括号
cout << num[i] << " " << (num[i]^t) << endl;
}
}
return 0;
}
HDU 2176 尼姆博弈
最新推荐文章于 2014-08-04 14:46:30 发布