#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 55;
const int MOD = 1e9 + 7;
int n;
int d[MAXN];
int dp[2][MAXN][MAXN][MAXN][MAXN];
const int INV = 500000004;
void inline add(int &a, int b) {
  a = a + b;
  if (a >= MOD) a -= MOD;
  if (a < 0) a += MOD;
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i < (n + 1); i++) scanf("%d", d + i), d[i]--;
  int cur = 0, nxt = 1;
  dp[cur][d[1] == 1][d[1] == 2][d[2] == 1][d[2] == 2] = 1;
  for (int i = (3); i < (n + 1); i++) {
    memset(dp[nxt], 0, sizeof dp[nxt]);
    for (int p1 = (0); p1 < (n + 1); p1++)
      for (int p2 = (0); p2 < (n + 1); p2++)
        for (int q1 = (0); q1 < (n + 1); q1++)
          for (int q2 = (0); q2 < (n + 1); q2++)
            if (dp[cur][p1][p2][q1][q2] > 0) {
              if (p1 == 0 && p2 == 0) {
                add(dp[cur][q1][q2][0][0], dp[cur][p1][p2][q1][q2]);
                continue;
              }
              if (d[i] == 1) {
                if (p1 >= 1) {
                  int val = dp[cur][p1][p2][q1][q2] * 1ll * p1 % MOD;
                  add(dp[nxt][p1 - 1][p2][q1 + 1][q2], val);
                  if (q2 > 0)
                    add(dp[nxt][p1 - 1][p2][q1 + 1][q2 - 1],
                        1ll * val * q2 % MOD);
                  if (q1 > 0)
                    add(dp[nxt][p1 - 1][p2][q1 - 1][q2], 1ll * val * q1 % MOD);
                }
                if (p2 >= 1) {
                  int val = dp[cur][p1][p2][q1][q2] * 1ll * p2 % MOD;
                  add(dp[nxt][p1 + 1][p2 - 1][q1 + 1][q2], val);
                  if (q2 > 0)
                    add(dp[nxt][p1 + 1][p2 - 1][q1 + 1][q2 - 1],
                        1ll * val * q2 % MOD);
                  if (q1 > 0)
                    add(dp[nxt][p1 + 1][p2 - 1][q1 - 1][q2],
                        1ll * val * q1 % MOD);
                }
              }
              if (d[i] == 2) {
                if (p1 >= 1) {
                  int val = dp[cur][p1][p2][q1][q2] * 1ll * p1 % MOD;
                  add(dp[nxt][p1 - 1][p2][q1][q2 + 1], val);
                  if (q1 > 0)
                    add(dp[nxt][p1 - 1][p2][q1][q2], 1ll * val * q1 % MOD);
                  if (q2 > 0)
                    add(dp[nxt][p1 - 1][p2][q1 + 2][q2 - 1],
                        1ll * val * q2 % MOD);
                  if (q2 > 1)
                    add(dp[nxt][p1 - 1][p2][q1 + 2][q2 - 2],
                        1ll * val * q2 * (q2 - 1) % MOD * INV % MOD);
                  if (q1 > 1)
                    add(dp[nxt][p1 - 1][p2][q1 - 2][q2],
                        1ll * val * q1 * (q1 - 1) % MOD * INV % MOD);
                  if (q2 > 0 && q1 > 0)
                    add(dp[nxt][p1 - 1][p2][q1][q2 - 1],
                        1ll * val * q1 * q2 % MOD);
                }
                if (p2 >= 1) {
                  int val = dp[cur][p1][p2][q1][q2] * 1ll * p2 % MOD;
                  add(dp[nxt][p1 + 1][p2 - 1][q1][q2 + 1], val);
                  if (q1 > 0)
                    add(dp[nxt][p1 + 1][p2 - 1][q1][q2], 1ll * val * q1 % MOD);
                  if (q2 > 0)
                    add(dp[nxt][p1 + 1][p2 - 1][q1 + 2][q2 - 1],
                        1ll * val * q2 % MOD);
                  if (q2 > 1)
                    add(dp[nxt][p1 + 1][p2 - 1][q1 + 2][q2 - 2],
                        1ll * val * q2 * (q2 - 1) % MOD * INV % MOD);
                  if (q1 > 1)
                    add(dp[nxt][p1 + 1][p2 - 1][q1 - 2][q2],
                        1ll * val * q1 * (q1 - 1) % MOD * INV % MOD);
                  if (q2 > 0 && q1 > 0)
                    add(dp[nxt][p1 + 1][p2 - 1][q1][q2 - 1],
                        1ll * val * q1 * q2 % MOD);
                }
              }
            }
    swap(cur, nxt);
  }
  cout << dp[cur][0][0][0][0] << endl;
}
