#include<cstdio>
#include<algorithm>
using namespace std;
int n,m[25],half,tot1,tot2,po[25],ans,vist[11000000];
struct unit
{
int state,val;
bool operator < (const unit&x) const
{
if(val!=x.val) return val<x.val;
else return state<x.state;
}
}set1[60000],set2[60000];
void dfs1(int x,int state,int sum)
{
if(x>half)
{
set1[++tot1]={state,sum};
return;
}
dfs1(x+1,state,sum);
dfs1(x+1,state|po[x],sum+m[x]);
dfs1(x+1,state|po[x],sum-m[x]);
}
void dfs2(int x,int state,int sum)
{
if(x>n)
{
set2[++tot2]={state,sum};
return;
}
dfs2(x+1,state,sum);
dfs2(x+1,state|po[x],sum+m[x]);
dfs2(x+1,state|po[x],sum-m[x]);
}
int main()
{
for(int i=1,j=1;i<=20;i++,j<<=1)
po[i]=j;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&m[i]);
half=n/2;
dfs1(1,0,0);
dfs2(half+1,0,0);
sort(set1+1,set1+tot1+1);
sort(set2+1,set2+tot2+1);
/*for(int i=1;i<=tot1;i++)
printf("%d ",set1[i].val);
printf("\n");
for(int i=1;i<=tot2;i++)
printf("%d ",set2[i].val);
printf("\n%d %d\n",tot1,tot2);*/
int l=1,r=tot2,r0=tot2;
while(l<=tot1&&r0)
{
//printf("%d %d %d %d\n",l,r,r0,ans);
if(set1[l].val==set1[l-1].val)
{
if(set1[l].state==set1[l-1].state)
{
l++;
continue;
}
for(int i=r+1;i<=r0;i++)
if(!vist[set1[l].state|set2[i].state])
{
vist[set1[l].state|set2[i].state]=1;
ans++;
}
}
else
{
for(r0=r;r0>0;r0--)
if(set2[r0].val+set1[l].val<=0)
break;
r=r0;
if(!(set2[r0].val+set1[l].val))
{
for(;r>0;r--)
if(set2[r].val+set1[l].val<0)
break;
for(int i=r+1;i<=r0;i++)
if(!vist[set1[l].state|set2[i].state])
{
vist[set1[l].state|set2[i].state]=1;
ans++;
}
}
}
l++;
}
printf("%d",ans-1);
return 0;
}