#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n) {
  long long r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1) r = r * a % P;
  return r;
}
long long inv(long long first) {
  return first <= 1 ? 1 : inv(P % first) * (P - P / first) % P;
}
inline int rd() {
  int first = 0;
  char p = getchar();
  while (p < '0' || p > '9') p = getchar();
  while (p >= '0' && p <= '9') first = first * 10 + p - '0', p = getchar();
  return first;
}
const int N = 55;
int n, a[N], dp[2][N][N][N][N];
void add(int &a, long long b) { a = (a + b) % P; }
long long C(int first) { return (long long)first * (first - 1) / 2; }
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", a + i);
  int cur = 0;
  dp[cur][a[1] == 2][a[1] == 3][a[2] == 2][a[2] == 3] = 1;
  for (int i = 3; i <= n; ++i) {
    cur ^= 1;
    memset(dp[cur], 0, sizeof dp[0]);
    for (int a1 = i - 1; a1 >= 0; --a1)
      for (int a2 = i - 1 - a1; a2 >= 0; --a2)
        for (int b1 = i - 1 - a1 - a2; b1 >= 0; --b1)
          for (int b2 = i - 1 - b1 - a2 - a1; b2 >= 0; --b2) {
            long long r = dp[!cur][a1][a2][b1][b2];
            if (!r) continue;
            if (a[i] == 2) {
              if (a1) add(dp[cur][a1 - 1][a2][b1 + 1][b2], a1 * r);
              if (a2) add(dp[cur][a1 + 1][a2 - 1][b1 + 1][b2], a2 * r);
              if (a1 && b1) add(dp[cur][a1 - 1][a2][b1 - 1][b2], a1 * b1 * r);
              if (a1 && b2)
                add(dp[cur][a1 - 1][a2][b1 + 1][b2 - 1], a1 * b2 * r);
              if (a2 && b1)
                add(dp[cur][a1 + 1][a2 - 1][b1 - 1][b2], a2 * b1 * r);
              if (a2 && b2)
                add(dp[cur][a1 + 1][a2 - 1][b1 + 1][b2 - 1], a2 * b2 * r);
              if (!a1 && !a2) {
                if (b1) add(dp[cur][b1 - 1][b2][1][0], b1 * r);
                if (b2) add(dp[cur][b1 + 1][b2 - 1][1][0], b2 * r);
              }
            } else {
              if (a1) add(dp[cur][a1 - 1][a2][b1][b2 + 1], a1 * r);
              if (a2) add(dp[cur][a1 + 1][a2 - 1][b1][b2 + 1], a2 * r);
              if (a1 && b1) add(dp[cur][a1 - 1][a2][b1][b2], a1 * b1 * r);
              if (a1 && b2)
                add(dp[cur][a1 - 1][a2][b1 + 2][b2 - 1], a1 * b2 * r);
              if (a2 && b1) add(dp[cur][a1 + 1][a2 - 1][b1][b2], a2 * b1 * r);
              if (a2 && b2)
                add(dp[cur][a1 + 1][a2 - 1][b1 + 2][b2 - 1], a2 * b2 * r);
              if (a1 && b1 && b2)
                add(dp[cur][a1 - 1][a2][b1][b2 - 1], a1 * b1 * b2 * r);
              if (a2 && b1 && b2)
                add(dp[cur][a1 + 1][a2 - 1][b1][b2 - 1], a2 * b1 * b2 * r);
              if (b1 >= 2 && a1)
                add(dp[cur][a1 - 1][a2][b1 - 2][b2], C(b1) * a1 * r);
              if (b1 >= 2 && a2)
                add(dp[cur][a1 + 1][a2 - 1][b1 - 2][b2], C(b1) * a2 * r);
              if (b2 >= 2 && a1)
                add(dp[cur][a1 - 1][a2][b1 + 2][b2 - 2], C(b2) * a1 * r);
              if (b2 >= 2 && a2)
                add(dp[cur][a1 + 1][a2 - 1][b1 + 2][b2 - 2], C(b2) * a2 * r);
              if (!a1 && !a2) {
                if (b1) add(dp[cur][b1 - 1][b2][0][1], b1 * r);
                if (b2) add(dp[cur][b1 + 1][b2 - 1][0][1], b2 * r);
              }
            }
          }
  }
  printf("%d\n", dp[cur][0][0][0][0]);
}
