一、题目
二、解法
取石子 s g sg sg函数的就是异或和,我们要利用任意子集 x o r xor xor值 ≠ 0 \not=0 =0,进而可以联想线性基。
先手一定会留给后手一个线性基,那么后手怎么取还是改变不了它是线性基,最后线性基就会留给先手,所以先手必赢。现在我们就要让线性基里面的权值和最大,那么取走的就最小,我们直接排序,然后贪心地插入线性基,这个贪心的由来:here
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define int long long
const int M = 105;
int read()
{
int x=0,flag=1;char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int T,n,ans,p[40];
void ins(int x)
{
for(int i=30;i>=0;i--)
{
if(!(x>>i&1)) continue;
if(!p[i]) {p[i]=x;break;}
x^=p[i];
}
if(x) ans++;
}
signed main()
{
T=10;
while(T--)
{
n=read();ans=0;
memset(p,0,sizeof p);
for(int i=1;i<=n;i++)
ins(read());
if(ans==n) puts("YES");
else puts("NO");
}
}