[bzoj3687]简单题

来源:互联网 发布:弯刀对着瓢切菜 知乎 编辑:程序博客网 时间:2024/06/09 08:04

http://www.lydsy.com/JudgeOnline/problem.php?id=3687
首先,对于每个和如果出现次数超过1,只会产生0次或1次的贡献,因为x^x=0…
所以只需记出现次数and 1…
f[i]表示和为i的集合出现次数and 1..
对于每个新的数x都会使f[i+x]^=f[i].
所以用bitset会比较优越
Orz w_yqts

#include <bits/stdc++.h>using namespace std;bitset <2000000> f;int n,m,ans,x;int main(){    f[0]=1;    cin>>n;    while (n--)    {        scanf("%d",&x);        m+=x;        f^=f<<x;    }    for (int i=1;i<=m;++i) ans^=i*f[i];    cout<<ans<<endl;}

代码参照hzwer…

原创粉丝点击