RT
#include <bits/stdc++.h>
#define int unsigned int
using namespace std;
const int maxn=15;
const int dd=(int)(1e9)+7;
short n;
int k;
short a[maxn],sum[maxn];
int p[maxn];
unordered_map <int,int> mem[maxn][maxn];
inline int read(){
int ret=0,f=1; char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
return ret*f;
}
inline bool pd(int x){return sum[x]>a[x];}
inline bool add(int x,int val,int &c){
c+=val*p[x];
sum[x]+=val;
return !pd(x);
}
int dfs(short x,short y,int c){
int ans=0;
if(mem[x][y].count(c)) return mem[x][y][c];
if(x>n) return 1; if(y>n) return a[x]==sum[x]?dfs(x+1,x+2,c):0;
if((n-y+1)*3+sum[x]<a[x]||sum[x]>a[x]) return 0;
if((n-y+1)*3+sum[x]==a[x]){
if(add(x,(n-y+1)*3,c)) ans=dfs(x+1,x+2,c);
add(x,-(n-y+1)*3,c);
return ans;
}
if(sum[x]==a[x]){
for(k=y;k<=n;k++) add(k,3,c);
ans=dfs(x+1,x+2,c);
for(k=y;k<=n;k++) add(k,-3,c);
return ans;
}
if(add(x,1,c)&&add(y,1,c)) ans+=dfs(x,y+1,c); add(x,-1,c); add(y,-1,c);
if(add(y,3,c)) ans+=dfs(x,y+1,c); add(y,-3,c);
if(add(x,3,c)) ans+=dfs(x,y+1,c); add(x,-3,c);
return mem[x][y][c]=ans%dd;
}
void scan(){
int k,j,i;
n=read(); p[0]=1;
for(k=1;k<=n;k++) a[k]=read();
for(k=1;k<=n;k++) p[k]=dd*p[k-1];
sort(a+1,a+n+1);
}
signed main(){
scan(); printf("%u\n",dfs(1,2,0)%dd);
return 0;
}