#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
inline int read()
{
char c=getchar();int num=0;bool f=1;
for(;!isdigit(c);c=getchar())
f=c=='-'?0:f;
for(;isdigit(c);c=getchar())
num=num*10+c-'0';
return f?num:-num;
}
const int N=1e4+5;
int n,m;
int d[N],tot;
int prime[N],cnt;
bool flag[N];
void init()
{
for(int i=2,t;i<N;++i)
{
if(!flag[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&(t=i*prime[j])<N;++j)
{
flag[t]=1;
if(i%prime[j]==0)
break;
}
}
}
inline LL ksm(LL x,LL k)
{
LL res=1;
while(k)
{
if(k&1)
res=res*x;
x*=x;
k>>=1;
}
return res;
}
int num[N];
inline void chai(int x,int f)
{
for(int i=1;i<=cnt&&x>1;++i)
{
while(x%prime[i]==0)
{
num[i]+=f;
x/=prime[i];
}
}
return;
}
int ans[N],l,x;
inline void mul(int *a)
{
x=0;
ans[1]=l=1;
for(int i=1;i<=cnt;++i)
{
for(int j=1;j<=a[i];++j)
{
for(int k=1;k<=l;++k)
{
ans[k]=ans[k]*prime[i]+x;
x=ans[k]/10;
ans[k]%=10;
}
while(x)
{
ans[++l]=x%10,
x/=10;
}
}
}
}
int main()
{
// freopen("3.in","r",stdin);
// freopen("466.out","w",stdout);
init();
n=read();
if(n==1)
{
n=read();
if(n)
putchar('0');
else
putchar('1');
return 0;
}
for(int i=1;i<=n;++i)
{
d[i]=read();
if(d[i]==0)
{
puts("0");
return 0;
}
if(d[i]==-1)
++m;
else
{
tot+=(d[i]-=1);
for(int j=1;j<=d[i];++j)
chai(j,-1);
}
}
if(tot>n-2)
{
puts("0");
return 0;
}
for(int i=1;i<=n-2-tot;++i)
chai(i,-1);
for(int i=1;i<=n-2;++i)
chai(i,1);
if(m>1)
{
for(int i=1;i<=n-2-tot;++i)
chai(m,1);
}
mul(num);
for(;l;--l)
cout<<ans[l];
return 0;
}