[文章目录]
Description
求一个n个元素的集合{a}的子集的算术和的亦或和。n<=1000<=2*10^6
发现和的种类很小,所以说可以统计每种和的个数,不,是奇偶(1,0)。枚举物品,类似背包来更新每种和的奇偶。发现好像就是每次把01序列左移,然后和原序列取亦或。
bitset优化,时间复杂度O(n*sum/32)
#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
bitset<2001000>bit;
int main()
{
int n,x; scanf("%d",&n); bit[0]=1;
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
bit=bit^(bit<<x);
}
int ans=0;
for(int i=1;i<=2000000;++i) if(bit[i]) ans^=i;
printf("%d",ans);
return 0;
}