用这道题学一下bitset,感觉没什么大用处其实就相当于一个布尔数组,可以快速左移右移,再就没大有别的用处了吧,不明觉厉。这道题f[i]表示和为i的集合个数为奇数还是偶数,f<<x表示f集合加上x后的集合,每次加入一个数,就用原集合异或一下这个集合就可以了。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<bitset>
#define maxn 2000010
using namespace std;
int n;
long long ans;
bitset<maxn> f;
int main()
{
scanf("%d",&n);
f[0]=1;
for (int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
f=f^(f<<x);
}
for (int i=1;i<=2000000;i++)
if (f[i]) ans^=i;
printf("%lld\n",ans);
return 0;
}