#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef pair PII; typedef long long ll; #define FOR(i,a,b) for(int i = (a); i < (b); ++i) #define FOR2(i,a,b) for(int i = (a); i > (b); --i) //#define FOR(i,b) for(int i = 0; i < (b); ++i) #define FORTO(i,a,b) for(int i = (a); i <= (b); ++i) #define FORD(i,b) for(int i = (b)-1; i >= 0; --i) #define FOREACH(it,a) for(typeof((a).begin()) it = (a).begin(); it != (a).end(); ++it) #define $(x) int((x).size()) const int BASE = 10; vector to_big(int n) { vector res; while (n) { res.push_back(n%BASE); n /= BASE; } return res; } void print(const vector & n) { if (n.empty()) printf("0\n"); else { FOR2(i, n.size()-1, -1) printf("%d", n[i]); printf("\n"); } } void add(vector & a, const vector & b) //a+=b { int carry = 0; FOR(i, 0, b.size()) { if (a.size() == i) a.push_back(0); a[i] += b[i] + carry; carry = a[i] / BASE; a[i] %= BASE; } int ind = b.size(); while (carry) { if (a.size() == ind) a.push_back(0); a[ind] += carry; carry = a[ind] / BASE; a[ind] %= BASE; ++ind; } } void multiply_scalar(vector & a, int b) //a *= b { int carry = 0; FOR(i, 0, a.size()) { a[i] *= b; a[i] += carry; carry = a[i] / BASE; a[i] %= BASE; } while (carry) { a.push_back(carry % BASE); carry /= BASE; } } vector multiply(const vector & a, const vector & b) //c = a * b { vector res, zeros; FOR(i, 0, a.size()) { if (a[i]) { vector temp = b; multiply_scalar(temp, a[i]); //cout << "temp: "; print(temp); temp.insert(temp.begin(), zeros.begin(), zeros.end()); //print(temp); add(res, temp); //cout << "res: "; print(res); } zeros.push_back(0); } return res; } bool visited[107][107]; vector dp[107][107]; vector & go(int a, int b) { if (visited[a][b]) return dp[a][b]; visited[a][b] = true; if (!a || !b) dp[a][b].push_back(1); else { add(dp[a][b], go(a-1, b)); add(dp[a][b], go(a, b-1)); } return dp[a][b]; } struct Node { Node(): left(NULL), right(NULL), nl(0), nr(0) { } Node * left, * right; int val; int nl, nr; }; Node * insert(Node * n, int val) { if (n == NULL) { n = new Node(); n->val = val; return n; } if (val < n->val) { ++(n->nl); n->left = insert(n->left, val); } else { ++(n->nr); n->right = insert(n->right, val); } return n; } void del(Node * n) { if (n->left) del(n->left); if (n->right) del(n->right); delete n; } vector solve(Node * n) { vector res; if (!n) res.push_back(1); else { res = go(n->nl, n->nr); res = multiply(res, solve(n->left)); res = multiply(res, solve(n->right)); } return res; } void print(Node * n) { printf("%d [%d] [%d]\n", n->val, n->nl, n->nr); if (n->left) print(n->left); if (n->right) print(n->right); } int main() { while (1) { int N; scanf("%d", &N); if (!N) break; Node * root = NULL; FOR(i, 0, N) { int val; scanf("%d", &val); root = insert(root, val); } //print(root); vector res = solve(root); print(res); del(root); } return 0; }