第一组数据是样例,本地跑的飞快,luoguIDETLE
求助大佬
#include<bits/stdc++.h>
using namespace std;
class node{
public :
int mp[9000008];
node() {
for(int i=1;i<9000007;i++) mp[i]=-4000000000;
}
int hash(int x) {
int ghj=x%9000007;
while(mp[ghj]!=-4000000000 and mp[ghj]!=x) {
ghj++;
if(ghj>=9000007) ghj=0;
}
mp[ghj]=x;
return ghj;
}
}ghj;
#define ll int
ll head[1000010],to[1000010],nxt[1000010],total,mid,h[21],ans,n;
bool net[2000][2000];
void add_edge(int u,int v) {
total++;
to[total]=v;
nxt[total]=head[u];
head[u]=total;
}
ll read() {
ll s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
s=s*10+ch-'0';
ch=getchar();
}
return s*f;
}
void dfs1(int now,int st,int suma,int sumb) {
if(now==mid+1) {
if(suma<sumb) return ;
int k=ghj.hash(suma-sumb);
add_edge(k,st);
return;
}
dfs1(now+1,st<<1,suma,sumb);
dfs1(now+1,(st<<1)+1,suma+h[now],sumb);
dfs1(now+1,(st<<1)+1,suma,sumb+h[now]);
}
void dfs2(int now,int st,int suma,int sumb) {
if(now==mid) {
if(suma<sumb) return ;
int k=ghj.hash(suma-sumb);
for(int e=head[k];e;e=nxt[e]) {
if(!net[k][to[e]]) {
net[k][to[e]]=true;
ans++;
}
}
return;
}
dfs2(now-1,st<<1,suma,sumb);
dfs2(now-1,(st<<1)+1,suma+h[now],sumb);
dfs2(now-1,(st<<1)+1,suma,sumb+h[now]);
}
int main() {
// freopen("subset.in","r",stdin);
// freopen("subset.out","w",stdout);
n=read();
mid=n/2;
for(int i=1;i<=n;i++) h[i]=read();
dfs1(1,0,0,0);
dfs2(n,0,0,0);
cout<<ans-1;
// fclose(stdin);
// fclose(stdout);
return 0;
}