http://www.lydsy.com/JudgeOnline/problem.php?id=3687
首先,对于每个和如果出现次数超过1,只会产生0次或1次的贡献,因为x^x=0…
所以只需记出现次数and 1…
f[i]表示和为i的集合出现次数and 1..
对于每个新的数x都会使f[i+x]^=f[i].
所以用bitset会比较优越
Orz w_yqts
#include <bits/stdc++.h>
using namespace std;
bitset <2000000> f;
int n,m,ans,x;
int main()
{
f[0]=1;
cin>>n;
while (n--)
{
scanf("%d",&x);
m+=x;
f^=f<<x;
}
for (int i=1;i<=m;++i) ans^=i*f[i];
cout<<ans<<endl;
}
代码参照hzwer…