#include <bits/stdc++.h>   using namespace ::std;   const long long maxn = 52;   const long long mod = 1e9 + 7;   const long long inf = 1e9 + 500;   long long dp[2][maxn][maxn][maxn][maxn];   long long d[maxn];   bool bit;   long long kv;   void add(long long a, long long b, long long c, long long d, long long z) {     if (0 <= a && 0 <= b && 0 <= c && 0 <= d && a < maxn && b < maxn &&         c < maxn && d < maxn) {       dp[bit][a][b][c][d] += z * kv;       dp[bit][a][b][c][d] %= mod;     }   }   int main() {     long long n;     cin >> n;     for (long long i = 0; i < n; i++) {       cin >> d[i];     }     long long a1 = 0, a2 = 0, b1 = 0, b2 = 0;     if (d[0] == 2) {       b1++;     } else {       b2++;     }     if (d[1] == 2) {       a1++;     } else {       a2++;     }     dp[1][a1][a2][b1][b2] = 1;     for (long long i = 2; i < n; i++) {       bit = (i & 1);       long long k = i;       for (long long a1 = 0; a1 <= k; a1++) {         for (long long a2 = 0; a2 + a1 <= k; a2++) {           for (long long b1 = 0; b1 + a1 + a2 <= k; b1++) {             for (long long b2 = 0; b2 + a1 + a2 + b1 <= k; b2++) {               dp[bit][a1][a2][b1][b2] = 0;             }           }         }       }       for (long long a1 = 0; a1 <= k; a1++) {         for (long long a2 = 0; a2 + a1 <= k; a2++) {           for (long long b1 = 0; b1 + a1 + a2 <= k; b1++) {             for (long long b2 = 0; b2 + a1 + a2 + b1 <= k; b2++) {               kv = dp[!bit][a1][a2][b1][b2];               if (d[i] == 2) {                 add(a1 - 1, a2, b1 - 1, b2, a1 * b1);                 add(a1 + 1, a2 - 1, b1 - 1, b2, a2 * b1);                 add(a1 + 1, a2, b1 - 1, b2, b1);                 add(a1 - 1, a2, b1 + 1, b2 - 1, a1 * b2);                 add(a1 + 1, a2 - 1, b1 + 1, b2 - 1, a2 * b2);                 add(a1 + 1, a2, b1 + 1, b2 - 1, b2);                 if (b1 == 0 && b2 == 0) {                   add(1, 0, a1 - 1, a2, a1);                   add(1, 0, a1 + 1, a2 - 1, a2);                 }               } else {                 if (b1 == 0 && b2 == 0) {                   add(0, 1, a1 - 1, a2, a1);                   add(0, 1, a1 + 1, a2 - 1, a2);                 }                 add(a1, a2 + 1, b1 - 1, b2, b1);                 add(a1 + 1 + 1, a2 - 1, b1 - 1, b2, b1 * a2);                 add(a1 + 1 - 1, a2, b1 - 1, b2, b1 * a1);                 add(a1 - 2, a2, b1 - 1, b2, b1 * (a1 * (a1 - 1)) / 2);                 add(a1 + 2, a2 - 2, b1 - 1, b2, b1 * (a2 * (a2 - 1)) / 2);                 add(a1 + 1 - 1, a2 - 1, b1 - 1, b2, b1 * a1 * a2);                 add(a1, a2 + 1, b1 + 1, b2 - 1, b2);                 add(a1 + 1 + 1, a2 - 1, b1 + 1, b2 - 1, b2 * a2);                 add(a1 + 1 - 1, a2, b1 + 1, b2 - 1, b2 * a1);                 add(a1 - 2, a2, b1 + 1, b2 - 1, b2 * (a1 * (a1 - 1)) / 2);                 add(a1 + 2, a2 - 2, b1 + 1, b2 - 1, b2 * (a2 * (a2 - 1)) / 2);                 add(a1 + 1 - 1, a2 - 1, b1 + 1, b2 - 1, b2 * a1 * a2);               }             }           }         }       }       k++;       for (long long a1 = 0; a1 <= k; a1++) {         for (long long a2 = 0; a2 + a1 <= k; a2++) {           for (long long b1 = 0; b1 + a1 + a2 <= k; b1++) {             for (long long b2 = 0; b2 + a1 + a2 + b1 <= k; b2++) {               dp[bit][a1][a2][b1][b2] %= mod;             }           }         }       }     }     long long ans = 0;     bool bb = (n - 1) & 1;     ans = dp[bb][0][0][0][0];     cout << ans % mod;   }