比赛 国庆欢乐赛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;
}