版权声明:作为一个蒟蒻,转载时请通知我这个蒟蒻 https://blog.csdn.net/zyszlb2003/article/details/89843197
欢迎大家访问我的老师的OJ———caioj.cn
题面描述
思路
我们先得到
判断 是否为 ,若为 ,则先手输,反之,先手必赢。
根据NIM博弈证明的 时,我们就能从 堆中取走若干石子,使其变成 ,使得 ,从而得到了一个各堆石子数异或起来等于 的局面。
AC code
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=1e4+10;
int a[N],sum;
bool b[N];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum^=a[i];
if(!sum)
{
puts("First Lose");
}
else
{
puts("First Win");
for(int i=1;i<=n;i++)
{
int k=sum^a[i];
if(a[i]>=k)
printf("%d %d\n",i,a[i]-k);
}
}
}
return 0;
}