#include <bits/stdc++.h>
using namespace std;
const int MN = 52;
const long long mod = 1e9 + 7;
int N;
long long dp[2][MN][MN][MN][MN];
vector<int> d;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N;
  d.resize(N);
  for (int i = 0; i < N; i++) {
    cin >> d[i];
  }
  int cur = 0, next = 1;
  dp[cur][d[0] == 2][d[0] == 3][d[1] == 2][d[1] == 3] = 1;
  for (int i = 1; i < N - 1; i++) {
    memset(dp[next], 0, sizeof(dp[next]));
    for (int p1 = 0; p1 <= N; p1++)
      for (int p2 = 0; p1 + p2 <= N; p2++)
        for (int c1 = 0; c1 + p1 + p2 <= N; c1++)
          for (int c2 = 0; c1 + c2 + p1 + p2 <= N; c2++) {
            if (dp[cur][p1][p2][c1][c2] == 0) continue;
            long long val = dp[cur][p1][p2][c1][c2];
            if (p1 == 0 && p2 == 0) {
              dp[cur][c1][c2][0][0] += val;
              dp[cur][c1][c2][0][0] %= mod;
              continue;
            }
            for (int type = 0; type <= 1; type++) {
              int way;
              if (type == 0) {
                way = p1;
                if (p1 == 0) continue;
                p1--;
              } else {
                way = p2;
                if (p2 == 0) continue;
                p1++, p2--;
              }
              if (d[i + 1] == 2) {
                dp[next][p1][p2][c1 + 1][c2] += val * way;
                dp[next][p1][p2][c1 + 1][c2] %= mod;
                if (c1 >= 1) {
                  dp[next][p1][p2][c1 - 1][c2] += val * way * c1;
                  dp[next][p1][p2][c1 - 1][c2] %= mod;
                }
                if (c2 >= 1) {
                  dp[next][p1][p2][c1 + 1][c2 - 1] += val * way * c2;
                  dp[next][p1][p2][c1 + 1][c2 - 1] %= mod;
                }
              } else {
                dp[next][p1][p2][c1][c2 + 1] += val * way;
                dp[next][p1][p2][c1][c2 + 1] %= mod;
                if (c1 >= 1) {
                  dp[next][p1][p2][c1 - 1 + 1][c2] += val * way * c1;
                  dp[next][p1][p2][c1 - 1 + 1][c2] %= mod;
                }
                if (c2 >= 1) {
                  dp[next][p1][p2][c1 + 2][c2 - 1] += val * way * c2;
                  dp[next][p1][p2][c1 + 2][c2 - 1] %= mod;
                }
                if (c1 >= 2) {
                  dp[next][p1][p2][c1 - 2][c2] += val * way * c1 * (c1 - 1) / 2;
                  dp[next][p1][p2][c1 - 2][c2] %= mod;
                }
                if (c2 >= 2) {
                  dp[next][p1][p2][c1 + 2][c2 - 2] +=
                      val * way * c2 * (c2 - 1) / 2;
                  dp[next][p1][p2][c1 + 2][c2 - 2] %= mod;
                }
                if (c1 >= 1 && c2 >= 1) {
                  dp[next][p1][p2][c1 - 1 + 1][c2 - 1] += val * way * c2 * c1;
                  dp[next][p1][p2][c1 - 1 + 1][c2 - 1] %= mod;
                }
              }
              if (type == 0) {
                p1++;
              } else {
                p1--, p2++;
              }
            }
          }
    cur ^= 1, next ^= 1;
  }
  cout << dp[cur][0][0][0][0];
  return 0;
}
