#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;}