#include <bits/stdc++.h>
using namespace std;
using namespace std;
const long long int mod = 1e9 + 7;
const long long int ni = 333333336;
int n, t[60];
long long int dp[2][55][55][55][55];
long long int yu[100];
long long int yu2[60][60][60];
auto &now = dp[0];
auto &pre = dp[1];
inline void update(long long int &o, long long int p) {
  o += p;
  if (o >= mod) o -= mod;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < 100; ++i) {
    yu[i] = i * (i - 1) / 2;
  }
  for (int i = 1; i < 60; ++i) {
    for (int j = 1; j < 60; ++j) {
      for (int k = 1; k < 60; ++k) {
        yu2[i][j][k] = i * j * k;
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    scanf("%d", &t[i]);
  }
  if (t[0] == 3) {
    dp[0][0][0][1][1] = 1;
  } else {
    dp[0][0][0][0][1] = 1;
  }
  for (int i = 0; i + 1 < n; ++i) {
    memset(pre, 0, sizeof(pre));
    for (long long int a = 0; a < i + 3; ++a) {
      for (long long int b = 0; a + b < i + 3; ++b) {
        for (long long int c = 0; a + b + c < i + 3; ++c) {
          for (long long int d = 0; a + b + c + d < i + 3; ++d) {
            if (!now[a][b][c][d]) continue;
            long long int tem = now[a][b][c][d];
            if (t[i + 1] == 2) {
              if (a) update(pre[a - 1][b][c + 1][d], a * tem % mod);
              if (b) update(pre[a + 1][b - 1][c + 1][d], b * tem % mod);
              if (c && a == 0 && b == 0)
                update(pre[c - 1][d][1][0], c * tem % mod);
              if (d && a == 0 && b == 0)
                update(pre[c + 1][d - 1][1][0], d * tem % mod);
              if (a && c) update(pre[a - 1][b][c - 1][d], a * c * tem % mod);
              if (a && d)
                update(pre[a - 1][b][c + 1][d - 1], a * d * tem % mod);
              if (b && c)
                update(pre[a + 1][b - 1][c - 1][d], b * c * tem % mod);
              if (b && d)
                update(pre[a + 1][b - 1][c + 1][d - 1], b * d * tem % mod);
            } else {
              if (a) update(pre[a - 1][b][c][d + 1], a * tem % mod);
              if (b) update(pre[a + 1][b - 1][c][d + 1], b * tem % mod);
              if (c && a == 0 && b == 0)
                update(pre[c - 1][d][0][1], c * tem % mod);
              if (d && a == 0 && b == 0)
                update(pre[c + 1][d - 1][0][1], d * tem % mod);
              if (a && c) update(pre[a - 1][b][c][d], a * c * tem % mod);
              if (a && d)
                update(pre[a - 1][b][c + 2][d - 1], a * d * tem % mod);
              if (b && c) update(pre[a + 1][b - 1][c][d], b * c * tem % mod);
              if (b && d)
                update(pre[a + 1][b - 1][c + 2][d - 1], b * d * tem % mod);
              if (a && c && d)
                update(pre[a - 1][b][c][d - 1], yu2[a][c][d] * tem % mod);
              if (b && c && d)
                update(pre[a + 1][b - 1][c][d - 1], yu2[b][c][d] * tem % mod);
              if (c >= 2 && a)
                update(pre[a - 1][b][c - 2][d], yu[c] * a * tem % mod);
              if (c >= 2 && b)
                update(pre[a + 1][b - 1][c - 2][d], yu[c] * b * tem % mod);
              if (d >= 2 && a)
                update(pre[a - 1][b][c + 2][d - 2], yu[d] * a * tem % mod);
              if (d >= 2 && b)
                update(pre[a + 1][b - 1][c + 2][d - 2], yu[d] * b * tem % mod);
            }
          }
        }
      }
    }
    swap(now, pre);
  }
  if (t[0] == 3) now[0][0][0][0] = now[0][0][0][0] * ni % mod;
  cout << now[0][0][0][0] << endl;
  return 0;
}
