func_code_string: #include <bits/stdc++.h>   const long long mod = 1000000007;   long long qpow(long long v, long long st) {     long long r = 1;     while (st) {       if (st & 1) {         r *= v;         r %= mod;       }       v = v * v;       v %= mod;       st = st / 2;     }     return r;   }   long long f[1024];   long long dp[1024][1024];   long long sdp[1024][1024];   long long getDP(int, int);   long long getSdp(int b1, int b2) {     if (sdp[b1][b2] != -1) return sdp[b1][b2];     if (b2 == 0) return getDP(b1 - 2, 0);     sdp[b1][b2] = getSdp(b1, b2 - 1) + getDP(b1 - 2, b2) * qpow(f[b2], mod - 2);     sdp[b1][b2] %= mod;     return sdp[b1][b2];   }   long long getDP(int b1, int b2) {     if (dp[b1][b2] != -1) return dp[b1][b2];     if (!b1) return f[b2];     long long sol = 0;     if (b1 >= 2) {       long long p = getSdp(b1, b2);       p *= f[b2];       p %= mod;       p *= (b1 - 1);       p %= mod;       sol += p;       sol %= mod;     }     if (b2 > 0) {       sol += getDP(b1, b2 - 1) * b2;       sol %= mod;     }     sol += getDP(b1 - 1, b2);     if (sol >= mod) sol %= mod;     dp[b1][b2] = sol;     return dp[b1][b2];   }   int main() {     int i, j, k;     f[0] = 1;     for (i = 1; i <= 1000; i++) {       f[i] = f[i - 1] * i;       f[i] %= mod;     }     j = k = 0;     int n, l;     scanf( %d , &n);     for (i = 0; i < n; i++) {       scanf( %d , &l);       if (l == 1)         j++;       else         k++;     }     memset(dp, -1, sizeof(dp));     memset(sdp, -1, sizeof(sdp));     printf( %d n , (int)getDP(j, k));     return 0;   }   