题目:
题解:
Nim游戏就是xor为0的时候先手必败
那么我们第一次拿完之后就不能包含xor为0的子集,不然对方要是给你剩一个xor为0的子集不就输了
似乎就是线性基了
代码:
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
const int sz=31;
struct hh{LL a,c;}a[105];
int b[sz+5],n;
int cmp(hh a,hh b){return a.a>b.a;}
int main()
{
scanf("%d",&n);LL tot=0;
for (int i=1;i<=n;i++) scanf("%lld",&a[i].a),a[i].c=a[i].a,tot+=a[i].a;
sort(a+1,a+n+1,cmp);
LL ans=0;
for (int i=1;i<=n;i++)
for (int j=sz;j>=0;j--)
if (a[i].a>>j&1)
{
if (!b[j]) {b[j]=a[i].a; break;}
else
{
a[i].a^=b[j];
if (!a[i].a) ans+=a[i].c;
}
}
if (ans==tot) printf("-1");else printf("%lld",ans);
}