#include <bits/stdc++.h>
const int N = 51, Mod = 1e9 + 7;
int n, d[N], f[2][N][N][N][N];
void Init() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &d[i]);
}
void Add(int &x, const int &v) {
  x += v;
  if (x >= Mod) x -= Mod;
}
void Solve() {
  int op = 0, be = 2;
  if (d[1] == 2)
    f[op][0][1][0][0] = 1, be = 2;
  else if (d[2] == 2)
    f[op][0][1][1][0] = 1, be = 3;
  else
    f[op][0][1][0][1] = 1, be = 3;
  for (int i = be; i <= n; ++i, op ^= 1) {
    for (int pre1 = 0; pre1 <= i; ++pre1)
      for (int pre2 = 0; pre2 + pre1 <= i; ++pre2)
        for (int now1 = 0; now1 + pre1 + pre2 <= i; ++now1)
          for (int now2 = 0; now1 + now2 + pre1 + pre2 <= i; ++now2) {
            int v = f[op][pre1][pre2][now1][now2];
            f[op][pre1][pre2][now1][now2] = 0;
            if (!v) continue;
            if (!pre1 && !pre2) {
              if (now1 + now2) Add(f[op][now1][now2][0][0], v);
            } else if (d[i] == 2) {
              if (pre1) {
                Add(f[op ^ 1][pre1 - 1][pre2][now1 + 1][now2],
                    1ll * v * pre1 % Mod);
                if (now1)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1 - 1][now2],
                      1ll * v * pre1 * now1 % Mod);
                if (now2)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1 + 1][now2 - 1],
                      1ll * v * pre1 * now2 % Mod);
              }
              if (pre2) {
                Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1 + 1][now2],
                    1ll * v * pre2 % Mod);
                if (now1)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1 - 1][now2],
                      1ll * v * pre2 * now1 % Mod);
                if (now2)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1 + 1][now2 - 1],
                      1ll * v * pre2 * now2 % Mod);
              }
            } else if (d[i] == 3) {
              if (pre1) {
                Add(f[op ^ 1][pre1 - 1][pre2][now1][now2 + 1],
                    1ll * v * pre1 % Mod);
                if (now1)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1][now2],
                      1ll * v * pre1 * now1 % Mod);
                if (now2)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1 + 2][now2 - 1],
                      1ll * v * pre1 * now2 % Mod);
                if (now1 > 1)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1 - 2][now2],
                      1ll * v * pre1 * now1 * (now1 - 1) / 2 % Mod);
                if (now2 > 1)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1 + 2][now2 - 2],
                      1ll * v * pre1 * now2 * (now2 - 1) / 2 % Mod);
                if (now1 && now2)
                  Add(f[op ^ 1][pre1 - 1][pre2][now1][now2 - 1],
                      1ll * v * pre1 * now1 * now2 % Mod);
              }
              if (pre2) {
                Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1][now2 + 1],
                    1ll * v * pre2 % Mod);
                if (now1)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1][now2],
                      1ll * v * pre2 * now1 % Mod);
                if (now2)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1 + 2][now2 - 1],
                      1ll * v * pre2 * now2 % Mod);
                if (now1 > 1)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1 - 2][now2],
                      1ll * v * pre2 * now1 * (now1 - 1) / 2 % Mod);
                if (now2 > 1)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1 + 2][now2 - 2],
                      1ll * v * pre2 * now2 * (now2 - 1) / 2 % Mod);
                if (now1 && now2)
                  Add(f[op ^ 1][pre1 + 1][pre2 - 1][now1][now2 - 1],
                      1ll * v * pre2 * now1 * now2 % Mod);
              }
            }
          }
  }
  printf("%d\n", f[op][0][0][0][0]);
}
int main() {
  Init();
  Solve();
  return 0;
}
