#include <bits/stdc++.h>
using namespace std;
const int N = 50 + 7;
const int M = 20;
const int inf = 1000000007;
const long long linf = 1e18 + 7;
const double pi = acos(-1);
const double eps = 1e-9;
const bool multipleTest = 0;
int n;
int d[N];
int dp[2][N][N][N][N];
inline void add(int& x, long long a) {
  a %= inf;
  x += a;
  if (x >= inf) x -= inf;
}
void rem(int& x, int a) {
  x -= a;
  if (x < 0) x += inf;
}
void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i) scanf("%d", d + i);
  int cur = 0;
  if (d[1] == 2) {
    if (d[2] == 2)
      dp[cur][0][1][0][1] = 1;
    else
      dp[cur][0][1][1][0] = 1;
  } else {
    if (d[2] == 2) {
      dp[cur][1][0][0][1] = 1;
    } else {
      dp[cur][1][0][1][0] = 1;
    }
  }
  for (int i = 3; i <= n; ++i) {
    int pre = cur;
    cur ^= 1;
    for (int u = (0); u < (N); u++)
      for (int v = (0); v < (N); v++)
        for (int p = (0); p < (N); p++)
          for (int q = (0); q < (N); q++) dp[cur][u][v][p][q] = 0;
    for (int u = (0); u < (N); u++)
      for (int v = (0); v < (N); v++)
        for (int p = (0); p < (N); p++)
          for (int q = (0); q < (N); q++) {
            long long xx = dp[pre][u][v][p][q];
            if (!xx) continue;
            if (d[i] == 2) {
              if (u > 0) {
                add(dp[cur][u - 1][v + 1][p][q + 1], 1ll * u * xx % inf);
                if (q > 0) {
                  add(dp[cur][u - 1][v + 1][p][q - 1], 1ll * xx * u * q % inf);
                }
                if (p > 0) {
                  add(dp[cur][u - 1][v + 1][p - 1][q + 1],
                      xx * 1ll * u * p % inf);
                }
              }
              if (v > 0) {
                add(dp[cur][u][v - 1][p][q + 1], 1ll * v * xx % inf);
                if (q > 0) {
                  add(dp[cur][u][v - 1][p][q - 1], 1ll * xx * q * v % inf);
                }
                if (p > 0) {
                  add(dp[cur][u][v - 1][p - 1][q + 1], xx * 1ll * p * v % inf);
                }
              }
              if (u == 0 && v == 0 && (p > 0 || q > 0)) {
                if (p > 0) add(dp[cur][p - 1][q + 1][0][1], xx * 1ll * p % inf);
                if (q > 0) add(dp[cur][p][q - 1][0][1], xx * 1ll * q % inf);
              }
            } else {
              if (u > 0) {
                add(dp[cur][u - 1][v + 1][p + 1][q], 1ll * u * xx % inf);
                if (q > 0) {
                  add(dp[cur][u - 1][v + 1][p][q], 1ll * xx * q * u % inf);
                }
                if (p > 0) {
                  add(dp[cur][u - 1][v + 1][p - 1][q + 2],
                      xx * 1ll * p * u % inf);
                }
                if (p > 0 && q > 0) {
                  add(dp[cur][u - 1][v + 1][p - 1][q - 1 + 1],
                      1ll * xx * p * q * u % inf);
                }
                if (p > 1) {
                  add(dp[cur][u - 1][v + 1][p - 2][q + 2],
                      (1ll * xx * p * (p - 1) / 2) * u % inf);
                }
                if (q > 1) {
                  add(dp[cur][u - 1][v + 1][p][q - 2],
                      (1ll * xx * q * (q - 1) / 2) * u % inf);
                }
              }
              if (v > 0) {
                add(dp[cur][u][v - 1][p + 1][q], 1ll * v * xx % inf);
                if (q > 0) {
                  add(dp[cur][u][v - 1][p][q], 1ll * xx * q * v % inf);
                }
                if (p > 0) {
                  add(dp[cur][u][v - 1][p - 1][q + 2], xx * 1ll * p * v % inf);
                }
                if (p > 0 && q > 0) {
                  add(dp[cur][u][v - 1][p - 1][q - 1 + 1],
                      1ll * xx * p * q * v % inf);
                }
                if (p > 1) {
                  add(dp[cur][u][v - 1][p - 2][q + 2],
                      (1ll * xx * p * (p - 1) / 2) * v % inf);
                }
                if (q > 1) {
                  add(dp[cur][u][v - 1][p][q - 2],
                      (1ll * xx * q * (q - 1) / 2) * v % inf);
                }
              }
              if (u == 0 && v == 0 && (p > 0 || q > 0)) {
                if (p > 0) {
                  add(dp[cur][p - 1][q + 1][1][0], xx * 1ll * p % inf);
                }
                if (q > 0) {
                  add(dp[cur][p][q - 1][1][0], xx * 1ll * q % inf);
                }
              }
            }
          }
  }
  cout << dp[cur][0][0][0][0] << '\n';
}
int main() {
  int Test = 1;
  if (multipleTest) {
    cin >> Test;
  }
  for (int i = 0; i < Test; ++i) {
    solve();
  }
}
