BZOJ3687 计算子集和的异或和
题不知道怎么不见了,bzoj上已经没了3687这题了
题意:给你一个n 然后输入n个数 求这n个数的所有子集的和的异或和
思路:用bitset记录某个数是否在子集和中出现,利用bitset对二进制位的快速大量操作(移位),通过已经求出的子集和求出剩余的子集和
参考代码:
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <map> 5 #include <bitset> 6 #include <stdio.h> 7 #include <vector> 8 #define ll long long 9 using namespace std; 10 11 int main() 12 { 13 ll n,x,ans,sum; 14 while(~scanf("%I64d",&n)) 15 { 16 bitset<200005>b; 17 b[0]=1; 18 sum=ans=0; 19 for(ll i=0; i<n; i++) 20 { 21 scanf("%I64d",&x); 22 b^=b<<x; 23 sum+=x; 24 } 25 for(ll i=1; i<=sum; i++) 26 { 27 if(b[i]) ans^=i; 28 } 29 printf("%I64d\n",ans); 30 } 31 return 0; 32 }