首页 > 代码库 > bzoj3687 简单题
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 简单题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。