#include #include #include #define SIZE 31 struct long_num { int size; char digs[1000]; }; void lsum(struct long_num *_1, struct long_num *_2, struct long_num *result, int offset) { int i, carry = 0; result->size = _1->size + offset > _2->size ? _1->size + offset : _2->size; for(i = _1->size; i < result->size + offset; i ++) _1->digs[i] = 0; for(i = _2->size; i < result->size + offset; i ++) _2->digs[i] = 0; for(i = 0; i < offset; i ++) { result->digs[i] = _2->digs[i]; } for(i = offset; i < result->size; i ++) { int val = carry + _1->digs[i] + _2->digs[i + offset]; result->digs[i + offset] = val % 10; carry = val / 10; } if(carry) result->digs[result->size ++] = carry; } void lmults(struct long_num *n, int by, struct long_num *result) { int i, carry = 0; result->size = n->size; for(i = 0; i < n->size; i ++) { int val = carry + n->digs[i] * by; result->digs[i] = val % 10; carry = val / 10; } while(carry) { result->digs[result->size ++] = carry % 10; carry /= 10; } } void lmult(struct long_num *_1, struct long_num *_2, struct long_num *result) { struct long_num m, tmp; int i; result->size = 0; for(i = 0; i < _1->size; i ++) { lmults(_2, _1->digs[i], &m); memmove(m.digs + i, m.digs, m.size * sizeof *m.digs); m.size += i; memset(m.digs, 0, i * sizeof *m.digs); lsum(&m, result, &tmp, 0); *result = tmp; } } void lprint(struct long_num *_1) { int i; for(i = _1->size - 1; i >= 0; i --) putchar('0' + _1->digs[i]); } struct long_num table[SIZE][SIZE]; struct node { unsigned value; struct node *l, *r; unsigned count; struct long_num result; } data[SIZE], *root; unsigned ncount; struct long_num one; void compute(struct node *n) { struct long_num *lresult = &one, *rresult = &one, result; unsigned lcount = 0, rcount = 0; if(n->l) { compute(n->l); lresult = &n->l->result; lcount = n->l->count; } if(n->r) { compute(n->r); rresult = &n->r->result; rcount = n->r->count; } n->count = lcount + rcount + 1; lmult(lresult, rresult, &result); lmult(&result, &table[lcount][rcount], &n->result); } int main(int argc, char *argv[]) { unsigned i, j; one.size = 1; one.digs[0] = 1; for(i = 0; i < SIZE; i++) { table[0][i].size = 1; table[0][i].digs[0] = 1; } for(i = 1; i < SIZE; i ++) { table[i][0].size = 1; table[i][0].digs[0] = 1; for(j = 1; j < SIZE; j++) { lsum(&table[i-1][j], &table[i][j-1], &table[i][j], 0); } } while(scanf("%u", &ncount), ncount) { for(i = 0; i < ncount; i ++) { unsigned value; struct node **pos = &root; scanf("%u", &value); while(*pos) { if((*pos)->value > value) pos = &(*pos)->l; else pos = &(*pos)->r; } *pos = &data[i]; (*pos)->value = value; (*pos)->l = (*pos)->r = NULL; } compute(root); lprint(&root->result); putchar('\n'); } return 0; }