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