#include <bits/stdc++.h>
using namespace std;
using U64 = unsigned long long;
int main(){
//freopen("parentheses.inp","r",stdin);
//freopen("parentheses.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
vector<int> a; int x;
while (cin>>x) a.push_back(x);
int n=a.size();
if(n%2){ cout<<0; return 0; }
vector<int> vals=a, uniq=a;
sort(uniq.begin(),uniq.end());
uniq.erase(unique(uniq.begin(),uniq.end()),uniq.end());
int k=uniq.size();
for(int &v:vals) v=int(lower_bound(uniq.begin(),uniq.end(),v)-uniq.begin());
vector<vector<int>> pos(k);
for(int i=0;i<n;i++) pos[vals[i]].push_back(i);
vector<int> multi_id(k,-1);
vector<vector<int>> groups;
vector<int> single_pos;
for(int c=0;c<k;c++){
if((int)pos[c].size()>=2){
multi_id[c]=(int)groups.size();
groups.push_back(pos[c]);
}else{
single_pos.push_back(pos[c][0]);
}
}
int m=groups.size();
int r=single_pos.size();
vector<int> who(n,-1), forced_dir(n,0);
for(int g=0;g<m;g++) for(int p:groups[g]) who[p]=g;
U64 ans=0;
vector<int> gsize(m);
for(int g=0;g<m;g++) gsize[g]=(int)groups[g].size();
vector<int> openCnt(1<<min(m,25),0); // placeholder to avoid realloc
if(m==0){
vector<U64> dp(n+1,0), ndp(n+1,0);
dp[0]=1;
for(int i=0;i<n;i++){
int rem=n-i-1;
fill(ndp.begin(),ndp.end(),0);
for(int b=0;b<=n;b++) if(dp[b]){
if(b+1<=rem) ndp[b+1]+=dp[b];
if(b-1>=0) ndp[b-1]+=dp[b];
}
dp.swap(ndp);
}
cout<<dp[0];
return 0;
}
vector<int> forced(n,0);
for(int mask=0; mask<(1<<m); ++mask){
int fixedOpens=0;
for(int g=0;g<m;g++) if(mask>>g & 1) fixedOpens+=gsize[g];
int needOpen = n/2 - fixedOpens;
if(needOpen<0 || needOpen>r) continue;
for(int i=0;i<n;i++){ forced[i]=0; }
for(int g=0;g<m;g++){
int dir = (mask>>g)&1 ? 1 : -1;
for(int p:groups[g]) forced[p]=dir;
}
vector<U64> dp(n+1,0), ndp(n+1,0);
dp[0]=1;
int freeOpensLeft=needOpen;
for(int i=0;i<n;i++){
int rem=n-i-1;
fill(ndp.begin(),ndp.end(),0);
if(forced[i]==1){
for(int b=0;b<=n;b++) if(dp[b]){
if(b+1<=rem) ndp[b+1]+=dp[b];
}
}else if(forced[i]==-1){
for(int b=0;b<=n;b++) if(dp[b]){
if(b-1>=0) ndp[b-1]+=dp[b];
}
}else{
for(int b=0;b<=n;b++) if(dp[b]){
if(b+1<=rem && freeOpensLeft>0) ndp[b+1]+=dp[b];
if(b-1>=0) ndp[b-1]+=dp[b];
}
freeOpensLeft--;
}
dp.swap(ndp);
}
ans+=dp[0];
}
cout<<ans;
return 0;
}