#include <bits/stdc++.h>
using namespace std;
struct Key{
unsigned long long d,o;
bool operator==(Key const& other) const { return d==other.d && o==other.o; }
};
struct KeyHash{
size_t operator()(Key const& k) const {
return std::hash<unsigned long long>()(k.d*11400714819323198485ull ^ k.o);
}
};
int main(){
freopen("parentheses.inp","r",stdin);
freopen("parentheses.out","w",stdout);
vector<int> a; int x;
while (cin>>x) a.push_back(x);
int n=a.size();
if(n%2==1){ cout<<0; return 0; }
vector<int> vals=a;
vector<int> uniq=vals;
sort(uniq.begin(),uniq.end());
uniq.erase(unique(uniq.begin(),uniq.end()),uniq.end());
int k=uniq.size();
for(int &v:vals) v=lower_bound(uniq.begin(),uniq.end(),v)-uniq.begin();
vector<int> first(k,n), last(k,-1), cnt(k,0);
for(int i=0;i<n;i++){ first[vals[i]]=min(first[vals[i]],i); last[vals[i]]=max(last[vals[i]],i); }
vector<unordered_map<Key, unsigned long long, KeyHash>> dp(n+1), ndp(n+1);
dp[0][{0,0}]=1;
for(int i=0;i<n;i++){
for(int b=0;b<=n;b++) ndp[b].clear();
int v=vals[i];
unsigned long long bit=1ull<<v;
int rem=n-i-1;
for(int b=0;b<=n;b++){
if(dp[b].empty()) continue;
for(auto &it: dp[b]){
Key k0=it.first; unsigned long long ways=it.second;
bool decided = (k0.d & bit);
if(!decided){
int nb=b+1;
if(nb<=rem){
Key k1={k0.d|bit, k0.o|bit};
if(i==last[v]){ k1.d&=~bit; k1.o&=~bit; }
ndp[nb][k1]+=ways;
}
nb=b-1;
if(nb>=0){
Key k1={k0.d|bit, k0.o & ~bit};
if(i==last[v]){ k1.d&=~bit; k1.o&=~bit; }
ndp[nb][k1]+=ways;
}
}else{
int nb = (k0.o & bit) ? b+1 : b-1;
if(nb>=0 && nb<=rem){
Key k1=k0;
if(i==last[v]){ k1.d&=~bit; k1.o&=~bit; }
ndp[nb][k1]+=ways;
}
}
}
}
dp.swap(ndp);
}
cout << dp[0][{0,0}];
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgS2V5ewogICAgdW5zaWduZWQgbG9uZyBsb25nIGQsbzsKICAgIGJvb2wgb3BlcmF0b3I9PShLZXkgY29uc3QmIG90aGVyKSBjb25zdCB7IHJldHVybiBkPT1vdGhlci5kICYmIG89PW90aGVyLm87IH0KfTsKc3RydWN0IEtleUhhc2h7CiAgICBzaXplX3Qgb3BlcmF0b3IoKShLZXkgY29uc3QmIGspIGNvbnN0IHsKICAgICAgICByZXR1cm4gc3RkOjpoYXNoPHVuc2lnbmVkIGxvbmcgbG9uZz4oKShrLmQqMTE0MDA3MTQ4MTkzMjMxOTg0ODV1bGwgXiBrLm8pOwogICAgfQp9OwoKaW50IG1haW4oKXsKICAgIGZyZW9wZW4oInBhcmVudGhlc2VzLmlucCIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oInBhcmVudGhlc2VzLm91dCIsInciLHN0ZG91dCk7CgogICAgdmVjdG9yPGludD4gYTsgaW50IHg7CiAgICB3aGlsZSAoY2luPj54KSBhLnB1c2hfYmFjayh4KTsKICAgIGludCBuPWEuc2l6ZSgpOwogICAgaWYobiUyPT0xKXsgY291dDw8MDsgcmV0dXJuIDA7IH0KCiAgICB2ZWN0b3I8aW50PiB2YWxzPWE7CiAgICB2ZWN0b3I8aW50PiB1bmlxPXZhbHM7CiAgICBzb3J0KHVuaXEuYmVnaW4oKSx1bmlxLmVuZCgpKTsKICAgIHVuaXEuZXJhc2UodW5pcXVlKHVuaXEuYmVnaW4oKSx1bmlxLmVuZCgpKSx1bmlxLmVuZCgpKTsKICAgIGludCBrPXVuaXEuc2l6ZSgpOwogICAgZm9yKGludCAmdjp2YWxzKSB2PWxvd2VyX2JvdW5kKHVuaXEuYmVnaW4oKSx1bmlxLmVuZCgpLHYpLXVuaXEuYmVnaW4oKTsKCiAgICB2ZWN0b3I8aW50PiBmaXJzdChrLG4pLCBsYXN0KGssLTEpLCBjbnQoaywwKTsKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspeyBmaXJzdFt2YWxzW2ldXT1taW4oZmlyc3RbdmFsc1tpXV0saSk7IGxhc3RbdmFsc1tpXV09bWF4KGxhc3RbdmFsc1tpXV0saSk7IH0KCiAgICB2ZWN0b3I8dW5vcmRlcmVkX21hcDxLZXksIHVuc2lnbmVkIGxvbmcgbG9uZywgS2V5SGFzaD4+IGRwKG4rMSksIG5kcChuKzEpOwogICAgZHBbMF1bezAsMH1dPTE7CgogICAgZm9yKGludCBpPTA7aTxuO2krKyl7CiAgICAgICAgZm9yKGludCBiPTA7Yjw9bjtiKyspIG5kcFtiXS5jbGVhcigpOwogICAgICAgIGludCB2PXZhbHNbaV07CiAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGJpdD0xdWxsPDx2OwogICAgICAgIGludCByZW09bi1pLTE7CgogICAgICAgIGZvcihpbnQgYj0wO2I8PW47YisrKXsKICAgICAgICAgICAgaWYoZHBbYl0uZW1wdHkoKSkgY29udGludWU7CiAgICAgICAgICAgIGZvcihhdXRvICZpdDogZHBbYl0pewogICAgICAgICAgICAgICAgS2V5IGswPWl0LmZpcnN0OyB1bnNpZ25lZCBsb25nIGxvbmcgd2F5cz1pdC5zZWNvbmQ7CiAgICAgICAgICAgICAgICBib29sIGRlY2lkZWQgPSAoazAuZCAmIGJpdCk7CiAgICAgICAgICAgICAgICBpZighZGVjaWRlZCl7CiAgICAgICAgICAgICAgICAgICAgaW50IG5iPWIrMTsgCiAgICAgICAgICAgICAgICAgICAgaWYobmI8PXJlbSl7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSBrMT17azAuZHxiaXQsIGswLm98Yml0fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaT09bGFzdFt2XSl7IGsxLmQmPX5iaXQ7IGsxLm8mPX5iaXQ7IH0KICAgICAgICAgICAgICAgICAgICAgICAgbmRwW25iXVtrMV0rPXdheXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5iPWItMTsKICAgICAgICAgICAgICAgICAgICBpZihuYj49MCl7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSBrMT17azAuZHxiaXQsIGswLm8gJiB+Yml0fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaT09bGFzdFt2XSl7IGsxLmQmPX5iaXQ7IGsxLm8mPX5iaXQ7IH0KICAgICAgICAgICAgICAgICAgICAgICAgbmRwW25iXVtrMV0rPXdheXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgaW50IG5iID0gKGswLm8gJiBiaXQpID8gYisxIDogYi0xOwogICAgICAgICAgICAgICAgICAgIGlmKG5iPj0wICYmIG5iPD1yZW0pewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgazE9azA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGk9PWxhc3Rbdl0peyBrMS5kJj1+Yml0OyBrMS5vJj1+Yml0OyB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5kcFtuYl1bazFdKz13YXlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkcC5zd2FwKG5kcCk7CiAgICB9CgogICAgY291dCA8PCBkcFswXVt7MCwwfV07CiAgICByZXR1cm4gMDsKfQo=