比赛 |
国庆欢乐赛2 |
评测结果 |
TAWWWTTTTTTTTTTTTTTT |
题目名称 |
毛一琛 |
最终得分 |
5 |
用户昵称 |
梦那边的美好ME |
运行时间 |
47.992 s |
代码语言 |
C++ |
内存使用 |
3.51 MiB |
提交时间 |
2025-10-04 11:22:27 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m[100],sum;
ll cnt,tot,ans[1000],to[1000],cot,as;
bitset<24> aa[10000],bb[10000];
void dfs2(ll sum,ll num,bitset<24> aaa){
bitset<24> vis=aaa;
if (sum==num/2){
for (int i=1;i<=tot;i++){
if (bb[i]==vis) return;
}
bb[++tot]=vis;
// cout<<sum<<" "<<num<<" "<<vis<<endl;
for (int i=1;i<=cot;i++){
if (to[i]==num){
ans[i]++;
return;
}
}
ans[++cot]++;
to[cot]=num;
return;
}
if (sum>num/2) return;
for (int i=1;i<=n;i++){
if (vis[i]==1){
vis[i]=0;
dfs2(sum+m[i],num,vis);
vis[i]=1;
}
}
}
void dfs1(ll o,ll num,bitset<24> a){
bitset<24> vis=a;
if (o==n+1){
if (num==0) return;
if (num%2==1) return;
for (int i=1;i<=cnt;i++){
if (aa[i]==vis) return;
}
aa[++cnt]=vis;
int bb=0;
for (int i=1;i<=n;i++){
if (vis[i]==1) bb++;
}
if (bb==1||bb==2) return;
dfs2(0,num,vis);
return;
}
vis[o]=0;
dfs1(o+1,num-m[o],vis);
vis[o]=1;
dfs1(o+1,num,vis);
return;
}
int main(){
// freopen("in.in","r",stdin);
freopen("subsets.in","r",stdin);
freopen("subsets.out","w",stdout);
scanf("%lld",&n);
for (int i=1;i<=n;i++){
scanf("%lld",&m[i]);
sum+=m[i];
}
bitset<24> a;
dfs1(1,sum,a);
for (int i=1;i<=tot;i++){
as+=ans[i]*(ans[i]-1);
}
printf("%lld",as/2);
return 0;
}