#include #define MIL 1000000000 #define MAX 50 int N, cislo; struct ret { unsigned int val[MAX]; int pocetsynu; ret() { for (int i = 1; i < MAX; i++) val[i] = 0; val[0] = 1; pocetsynu = 0; } void sum(ret& v, ret& w) { for (int i = 0; i < MAX; i++) val[i] = 0; for (int i = 0; i < MAX; i++) val[i] += v.val[i] + w.val[i]; for (int i = 0; i < MAX-1; i++) { val[i+1] += val[i] / MIL; val[i] %= MIL; } } void mul(ret&v, ret& w) { for (int i = 0; i < MAX; i++) val[i] = 0; for (int i = 0; i < MAX; i++) { for (int j = 0; j < MAX-1 - i; j++) { long long int a = v.val[i]; long long int b = w.val[j]; long long int c = a * b; val[i+j+1] += c / MIL; val[i+j] += c % MIL; } } for (int i = 0; i < MAX-1; i++) { val[i+1] += val[i] / MIL; val[i] %= MIL; } } void tiskni() { int pozice = MAX-1; for (; pozice > 0; pozice--) if (val[pozice] != 0) break; printf("%d", val[pozice]); for (int i = pozice - 1; i >= 0; i--) { printf("%09d", val[i]); } } }; ret pascal[500][500]; struct node { node* l; node* r; int cislo; int pocet; node() { l = r = NULL; pocet = 1; } }; node koren; void add(node* root, int in); ret projdi(node* root); int main() { pascal[0][0].val[0] = 1; for (int i = 1; i < 105; i++) { for (int j = 0; j <= i; j++) { if (j == 0 || j == i) pascal[i][j].val[0] = 1; else pascal[i][j].sum(pascal[i-1][j-1],pascal[i-1][j]); /*printf("pascal[%d][%d] = ", i, j); pascal[i][j].tiskni(); printf("\n");*/ } } while (1) { scanf("%d", &N); if (N == 0) return 0; scanf("%d", &cislo); koren.cislo = cislo; koren.l = koren.r = NULL; for (int i = 1; i < N; i++) { scanf("%d", &cislo); add(&koren, cislo); } ret result = projdi(&koren); result.tiskni(); printf("\n"); } return 0; } void add(node* root, int in) { if (root->cislo > in) { if (root->l) { // printf("adding %d to left\n", in); add(root->l,in); } else { // printf("adding %d to left\n", in); root->l = new node; root->l->cislo = in; } } else { if (root->r) { // printf("adding %d to right\n", in); add(root->r,in); } else { //printf("adding %d to right\n", in); root->r = new node; root->r->cislo = in; } } } ret projdi(node* root) { //printf("projdi: %d:\n", root->cislo); ret l; ret r; if (root->l) l = projdi(root->l); if (root->r) r = projdi(root->r); ret result, result2; result.pocetsynu = l.pocetsynu + r.pocetsynu + 1; result2.mul(l,r); //result2.tiskni(); //printf(" mul\n"); //pascal[result.pocetsynu-1][l.pocetsynu].tiskni(); //printf(" mul %d %d\n", result.pocetsynu-1, l.pocetsynu); result.mul(result2, pascal[result.pocetsynu-1][l.pocetsynu]); //printf("%d result: ", root->cislo); //result.tiskni(); //printf("\n"); return result; }