#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
inline int gi(){
char tmp=getchar();int ans=0;int flag=1;
while(!isdigit(tmp)) {
if(tmp=='-'){
flag=-1;
tmp=getchar();
break;
}
tmp=getchar();
}
while(isdigit(tmp)){
ans=ans*10+tmp-'0';
tmp=getchar();
}
return ans*flag;
}
struct Big{
int Num[3002],len;
void init(){
len=1;memset(Num,0,sizeof Num);
}
void print(){
for(int i=len;i;--i)
printf("%d",Num[i]);
putchar('\n');
}
Big operator * (const int & b){
Big ans;
for(int i=1;i<=len;++i)
ans.Num[i]=Num[i];
ans.len=len+10;
for(int i=1;i<=len;++i){
int t=ans.Num[i]*b;
ans.Num[i]=t;
}
for(int i=1;i<=ans.len;++i)
ans.Num[i+1] += (ans.Num[i]/10),
ans.Num[i] = (ans.Num[i]%10);
while(!ans.Num[ans.len--]); // 去除前导0
ans.len++;
return ans;
}
Big operator / (const int &b){
Big ans=*this;
for(int i=ans.len;i;--i){
ans.Num[i-1]+=(ans.Num[i]%b)*10;
ans.Num[i]/=b;
}
while(!ans.Num[ans.len--]); // 去除前导0
ans.len++;
return ans;
}
};
int Degree[199239];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("data.in","r",stdin);
#endif
int n=gi();
int sum=0;
// test part =================================
/*
Big a;a.init();a.Num[1]=3;a.len=1;
for(int i=1;i<=20;++i){
a=a*3;
a.print();
}
for(int i=1;i<=20;++i)
a=a/3,a.print();
return 0;
// end test ===============================
*/
Big Mul;Mul.init();Mul.Num[1]=1;Mul.len=1;
int k=0;
for(int i=1;i<=n;++i){
int p=gi();
Degree[i]=p;
if(p!=-1){
++k;
sum+=p-1;
}
}
Big ans;
ans.init();
ans.Num[1]=1;ans.len=1;
for(int i=2;i<=n-2;++i)
ans=ans*i;
for(int i=1;i<=n;++i){
for(int j=2;j<Degree[i];++j)
ans=ans/j;
}
for(int i=2;i<=n-sum-2;++i)
ans=ans/i;
for(int i=1;i<=n-sum-2;++i){
ans=ans*(n-k);
}
ans.print();
return 0;
}