比赛 |
国庆欢乐赛2 |
评测结果 |
AAAAAAAAATTATAAATAAA |
题目名称 |
毛一琛 |
最终得分 |
80 |
用户昵称 |
wdsjl |
运行时间 |
17.793 s |
代码语言 |
C++ |
内存使用 |
30.50 MiB |
提交时间 |
2025-10-04 10:53:03 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("subsets.in","r",stdin);
freopen("subsets.out","w",stdout);
int n,t,i,m,s,a,b;
scanf("%d",&n);
vector<int> M(n);
for(i=0;i<n;++i)scanf("%d",&M[i]);
t=1<<n;
vector<int> s_m(t);
for(m=0;m<t;++m){
s=0;
for(i=0;i<n;++i)if(m&(1<<i))s+=M[i];
s_m[m]=s;
}
unordered_map<int,vector<int>> s2b;
for(b=1;b<t;++b)s2b[s_m[b]].push_back(b);
unordered_set<int> rst;
for(a=1;a<t;++a){
s=s_m[a];
auto it=s2b.find(s);
if(it==s2b.end())continue;
auto& bs=it->second;
for(int b:bs)if(!(a&b))rst.insert(a|b);
}
printf("%d\n",rst.size());
return 0;
}