bzoj3687 简单题
Posted 逢山开路 遇水架桥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3687 简单题相关的知识,希望对你有一定的参考价值。
传送门: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; }
以上是关于bzoj3687 简单题的主要内容,如果未能解决你的问题,请参考以下文章