令
fi
表示子集和是
i
的方案数,枚举
显然只有当
fi
是奇数时可以记入答案,那么
fi
就可以用
bitset
优化,更新时
f=f xor f<<ai
就可以了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
#define N 2000010
bitset<N>f;
int i,j,s,k,n,m,x,Ans;
int main(){
scanf("%d",&n);
f[0]=1;
for(i=1;i<=n;i++){
scanf("%d",&x);
s+=x;f^=f<<x;
}
for(i=1;i<=s;i++)
if(f[i])Ans^=i;
printf("%d\n",Ans);
return 0;
}