【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=3687
【题解】
简要来说就是求出有哪些和出现了奇数次。
记
fi,j
f
i
,
j
表示现在出来到第
i
i
个数和为的奇偶性。
于是有
fi,j=fi−1,j
f
i
,
j
=
f
i
−
1
,
j
^
fi−1,j−ai
f
i
−
1
,
j
−
a
i
bitset加速即可。
时间复杂度
O(N∗∑a/64)
O
(
N
∗
∑
a
/
64
)
注意由于此题数据不全不能使用读入优化,不全的数默认等于前面一个。
【代码】
/* - - - - - - - - - - - - - - -
User : VanishD
problem : [bzoj3687]
Points : bitset
- - - - - - - - - - - - - - - */
# include <bits/stdc++.h>
# define ll long long
# define inf 0x3f3f3f3f
# define N 1010
# define M 2000100
using namespace std;
int read(){
int tmp = 0, fh = 1; char ch = getchar();
while (ch < '0' || ch > '9'){ if (ch == '-') fh = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9'){ tmp = tmp * 10 + ch - '0'; ch = getchar(); }
return tmp * fh;
}
bitset <M> f;
int n, num, sum, ans;
int main(){
// freopen("bzoj3687.in", "r", stdin);
// freopen(".out", "w", stdout);
scanf("%d", &n);
f[0] = 1;
for (int i = 1; i <= n; i++){
scanf("%d", &num);
sum += num;
f = (f << num) ^ f;
}
for (int i = 1; i <= sum; i++)
if (f[i] == 1) ans ^= i;
printf("%d\n", ans);
return 0;
}