1. #include <cstdio>
    2. #include <algorithm>
    3. #include <cstdlib>
    4. #include <cstring>
    5. #include <cmath>
    6. #include <iostream>
    7. using namespace std;
    8. inline int gi(){
    9. char tmp=getchar();int ans=0;int flag=1;
    10. while(!isdigit(tmp)) {
    11. if(tmp=='-'){
    12. flag=-1;
    13. tmp=getchar();
    14. break;
    15. }
    16. tmp=getchar();
    17. }
    18. while(isdigit(tmp)){
    19. ans=ans*10+tmp-'0';
    20. tmp=getchar();
    21. }
    22. return ans*flag;
    23. }
    24. struct Big{
    25. int Num[3002],len;
    26. void init(){
    27. len=1;memset(Num,0,sizeof Num);
    28. }
    29. void print(){
    30. for(int i=len;i;--i)
    31. printf("%d",Num[i]);
    32. putchar('\n');
    33. }
    34. Big operator * (const int & b){
    35. Big ans;
    36. for(int i=1;i<=len;++i)
    37. ans.Num[i]=Num[i];
    38. ans.len=len+10;
    39. for(int i=1;i<=len;++i){
    40. int t=ans.Num[i]*b;
    41. ans.Num[i]=t;
    42. }
    43. for(int i=1;i<=ans.len;++i)
    44. ans.Num[i+1] += (ans.Num[i]/10),
    45. ans.Num[i] = (ans.Num[i]%10);
    46. while(!ans.Num[ans.len--]); // 去除前导0
    47. ans.len++;
    48. return ans;
    49. }
    50. Big operator / (const int &b){
    51. Big ans=*this;
    52. for(int i=ans.len;i;--i){
    53. ans.Num[i-1]+=(ans.Num[i]%b)*10;
    54. ans.Num[i]/=b;
    55. }
    56. while(!ans.Num[ans.len--]); // 去除前导0
    57. ans.len++;
    58. return ans;
    59. }
    60. };
    61. int Degree[199239];
    62. signed main()
    63. {
    64. #ifndef ONLINE_JUDGE
    65. freopen("data.in","r",stdin);
    66. #endif
    67. int n=gi();
    68. int sum=0;
    69. // test part =================================
    70. /*
    71. Big a;a.init();a.Num[1]=3;a.len=1;
    72. for(int i=1;i<=20;++i){
    73. a=a*3;
    74. a.print();
    75. }
    76. for(int i=1;i<=20;++i)
    77. a=a/3,a.print();
    78. return 0;
    79. // end test ===============================
    80. */
    81. Big Mul;Mul.init();Mul.Num[1]=1;Mul.len=1;
    82. int k=0;
    83. for(int i=1;i<=n;++i){
    84. int p=gi();
    85. Degree[i]=p;
    86. if(p!=-1){
    87. ++k;
    88. sum+=p-1;
    89. }
    90. }
    91. Big ans;
    92. ans.init();
    93. ans.Num[1]=1;ans.len=1;
    94. for(int i=2;i<=n-2;++i)
    95. ans=ans*i;
    96. for(int i=1;i<=n;++i){
    97. for(int j=2;j<Degree[i];++j)
    98. ans=ans/j;
    99. }
    100. for(int i=2;i<=n-sum-2;++i)
    101. ans=ans/i;
    102. for(int i=1;i<=n-sum-2;++i){
    103. ans=ans*(n-k);
    104. }
    105. ans.print();
    106. return 0;
    107. }