func_code_string: #include <bits/stdc++.h>   using namespace std;   double EPS = 1e-9;   int INF = 2000000000;   long long INFF = 8000000000000000000LL;   double PI = acos(-1);   int dirx[8] = {-1, 0, 0, 1, -1, -1, 1, 1};   int diry[8] = {0, 1, -1, 0, -1, 1, -1, 1};   inline string IntToString(int a) {     char x[100];     sprintf(x,  %d , a);     string s = x;     return s;   }   inline int StringToInt(string a) {     char x[100];     int res;     strcpy(x, a.c_str());     sscanf(x,  %d , &res);     return res;   }   inline string GetString(void) {     char x[1000005];     scanf( %s , x);     string s = x;     return s;   }   inline string uppercase(string s) {     int n = (int)s.size();     for (int(i) = (0); (i) < (n); ++(i))       if (s[i] >=  a  && s[i] <=  z ) s[i] = s[i] -  a  +  A ;     return s;   }   inline string lowercase(string s) {     int n = (int)s.size();     for (int(i) = (0); (i) < (n); ++(i))       if (s[i] >=  A  && s[i] <=  Z ) s[i] = s[i] -  A  +  a ;     return s;   }   inline void OPEN(string s) {     freopen((s +  .in ).c_str(),  r , stdin);     freopen((s +  .out ).c_str(),  w , stdout);   }   vector<int> angka;   int n, data[2005];   long long dewa[2005];   long long MOD = 1000000007;   bool sudah[2005];   int to[2005];   int conn;   int pisah;   long long risan;   long long C[2005][2005];   int main() {     scanf( %d , &n);     for (int(i) = (1); (i) <= (n); ++(i)) {       scanf( %d , &data[i]);       to[i] = data[i];     }     for (int(i) = (0); (i) <= (n); ++(i)) {       C[i][0] = C[i][i] = 1;       for (int(j) = (1); (j) <= (i - 1); ++(j))         C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;     }     dewa[1] = 0;     dewa[2] = 1;     dewa[0] = 1;     for (int(i) = (3); (i) <= (n); ++(i)) {       dewa[i] = (i - 1) * (dewa[i - 1] + dewa[i - 2]);       dewa[i] %= MOD;     }     memset(sudah, 0, sizeof(sudah));     for (int(i) = (1); (i) <= (n); ++(i)) {       if (to[i] == -1) continue;       int x = i;       while (x != -1) {         if (sudah[x]) goto hell;         sudah[x] = 1;         x = to[x];         if (x == i) goto hell;       }       ++conn;     hell:;     }     for (int(i) = (1); (i) <= (n); ++(i))       if (!sudah[i]) ++pisah;     for (int(i) = (0); (i) <= (conn); ++(i)) {       long long pos = (C[conn][i] * dewa[i + pisah]) % MOD;       risan = (risan + pos) % MOD;     }     printf( %d n , (int)risan);     return 0;   }   