传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3687
【题解】
记f[i]为和为i的子集出现了几次。
那么加入一个数x,如果选择,就相当于f整体左移x;不选择就是f。那么异或起来就行了。
用bitset实现。复杂度O(n*2000000/32)
# include <bitset> # include <stdio.h> # include <string.h> # include <algorithm> // # include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int M = 5e5 + 10; const int mod = 1e9+7; # define RG register # define ST static int n, x, ans; bitset<2000010> bs; int main() { scanf("%d", &n); bs[0] = 1; for (int i=1; i<=n; ++i) { scanf("%d", &x); bs = (bs << x) ^ bs; } for (int i=0; i<=2000000; ++i) if(bs[i]) ans ^= i; printf("%d\n", ans); return 0; }
时间: 2024-12-30 03:45:34