Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2176
取石子游戏,以前都是问能否胜,这次问更实际的问题--如何取胜。
思路很简单:取走一定量的石子,使其变为必败态。先算出总的状态,就是所有石子数异或后的值,取一个变量名叫allXor。
然后将allXor与其中一堆石子异或,得出的值假设叫oneXor,则得出的值为除这堆石子外的其他所有堆的石子的数量的异或值。
然后很容易想到如果这堆石子剩下的数量为oneXor,那么所有石子堆的数量异或得出的值为0,也就是必败态。
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
int main()
{
vector <int> stone;
vector <int> :: iterator it;
int n;
int i;
int allXor,oneXor;
int in;
while( scanf("%d",&n)!=EOF && n )
{
stone.clear();
allXor = 0; // initial
for( i=0;i<n;i++ )
{
scanf("%d", &in);
stone.push_back(in);
allXor ^= in;
}
if( allXor ) // judge
{
printf("Yes
");
for( it=stone.begin();it!=stone.end();it++ )
{
oneXor = allXor ^ *it;
/*for( i=0;i<*it;i++ )
{
if( (oneXor^i) == 0 )
{
printf("%d %d
", *it,i);
break;
}
}*/ // time limit exceeded
if( oneXor < *it )
{
printf("%d %d
", *it, oneXor);
}
}
}
else
{
printf("No
");
}
}
return 0;
}