#include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for (int i=0; i=0; i--) #define pb push_back #define fi first #define se second typedef long long ll; typedef pair pi; typedef vector vl; const int moc = 10000; void utras(vl &a) { REP(i,a.size()) { int g = a[i] / moc; a[i] %= moc; if (i + 1 < (int)a.size()) a[i + 1] += g; else if (g > 0) a.push_back(g); } } ostream& operator<<(ostream &out, vl a) { reverse(a.begin(), a.end()); out << a[0]; FOR(i,1,a.size()) { out.width(4); out.fill('0'); out << a[i]; } return out; } vl operator*(const vl &a, const vl &b) { vl c(a.size() + b.size() + 2, 0); REP(i,a.size()) { REP(j,b.size()) c[i + j] += a[i] * b[j]; utras(c); } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; } vl operator+(const vl &a, const vl &b) { vl c(max(a.size(), b.size()), 0); REP(i,a.size()) c[i] = a[i]; REP(i,b.size()) c[i] += b[i]; utras(c); while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; } vl c[115][115]; vl kolko(vector a) { if (a.size() <= 1) return vl(1, 1); vector p[2]; FOR(i,1,a.size()) p[a[i] >= a[0]].push_back(a[i]); vl r1 = kolko(p[0]); vl r2 = kolko(p[1]); return (r1 * r2) * c[p[0].size() + p[1].size()][p[0].size()]; } int main() { REP(i,105) { c[i][0] = vl(1, 1); FOR(j,1,i+1) c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; c[i][i + 1] = vl(1, 0); } int n; while (scanf("%d", &n) == 1) { if (!n) break; vector a(n); REP(i,n) scanf("%d", &a[i]); cout << kolko(a) << endl; } }