#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for (int i = (l); i <= (r); i++)
#define per(i,r,l) for (int i = (r); i >= (l); i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define maxn(a, b) a = max(a, b)
#define minn(a, b) a = min(a, b)
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
ll rp(ll a,ll b) {ll res=1; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a;a=a*a;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N = 154;
int n;
int d[N], cnt[N];
bool b[N];
int main() {
scanf("%d", &n);
b[1] = true;
rep(i,2,N-1) if(!b[i]) rep(j,i,N/i) {
b[i*j]=true;
}
ll sum = 0;
rep(i,1,n) {
scanf("%d", &d[i]);
sum += d[i] - 1;
}
if (n == 1 && d[1] == 0) return puts("1"), 0;
if (sum != n - 2) return puts("0"), 0;
rep(i,1,n) if (!d[i]) return puts("0"), 0;
auto add = [&](const int &x, const int &c) {
rep(i,1,n) if (!b[i]) {
for (int s = i, t = 1; s <= n; s *= i, t++) {
cnt[i] += c * (x / s) * t;
}
}
};
add(n - 2, 1);
rep(i,1,n) add(d[i] - 1, -1);
ll ans = 1;
rep(i,1,n) if (!b[i]) {
assert(cnt[i] >= 0);
ans *= rp(i, cnt[i]);
assert(ans <= 1e17);
}
printf("%lld\n", ans);
return 0;
}