f[i]表示和为i的子集是否有奇数个。那么f<<x表示的就是f集中的每一个子集都加上x所表示的集合,f^(f<<x)的意义就是加与不加x的子集合并
bitset好优美
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<bitset>
#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N
using namespace std;
bitset<2000010> f;
int main()
{
int n,x,sum=0;
scanf("%d",&n);
f[0]=1;
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
f^=f<<x;
}
int ans=0;
for (int i=1;i<=sum;i++)
if (f[i]) ans^=i;
printf("%d",ans);
return 0;
}