#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define pb push_back #define mp make_pair #define sz(a) ((int)(a.size())) #define all(a) a.begin(),a.end() #define eps 1e-11 #define REP(i,n) for(int (i)=0;i<(n);++i) #define REPS(i,n) for(int(i)=0;i<(n.size());++i) #define FOR(i,a,b) for(int(i)=(a);i<=(b);++i) #define FORD(i,a,b) for(int(i)=(a);i>=(b);--i) #define FORE(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();++it) #define se second #define fi first #define SQR(a) ((a)*(a)) #define pii pair #define int64 long long const int64 D=31; const int64 N=40; const int64 base = (1ll<>=D) { digits[i]=n&bitmask; cnt= ++i; } } BigInt operator+( const BigInt& b) const { int64 r=0; BigInt result; for(int i=0; i>=D; result.cnt = i+1; } return result; } BigInt operator*(int64 n) const { int64 r=0; BigInt result; for( int i=0; (i>=D; result.cnt = i+1; } return result; } BigInt operator*( const BigInt& b) const { BigInt result; for( int i=cnt-1;i>=0;i--) result = result * base + b * digits[i]; return result; } string str() const { string result ="0"; for( int i=cnt-1; i>=0; i--) { string temp; int64 r=0; for(int j=(int) result.length()-1; j>=0 || r; j--) { if(j>=0) r+=(result[j]-'0')*base; temp+=char('0'+r%10); r/=10; } result=""; r=digits[i]; for(int j=0;j<(int)temp.length() || r; j++) { if(j<(int)temp.length()) r+=(temp[j]-'0'); result+=char('0'+r%10); r/=10; } reverse(result.begin(),result.end()); } return result; } }; struct node { int val,left,right; }; node P[200]; int pocet; void vloz(int ind,int val) { if (P[ind].val==-1) { P[ind].val=val; return; } if (P[ind].val<=val) { if (P[ind].right==-1) { P[ind].right=++pocet; vloz(pocet,val); }else vloz(P[ind].right,val); return; }else { if (P[ind].left==-1) { P[ind].left=++pocet; vloz(pocet,val); }else vloz(P[ind].left,val); return; } } BigInt choose[105][105]; BigInt memo[105][105]; bool SEEN[105][105]; BigInt eval(int pr,int zost) { if (SEEN[pr][zost])return memo[pr][zost]; if (zost==0) return BigInt(1); if (pr==0) return BigInt(0); memo[pr][zost]=eval(pr-1,zost); memo[pr][zost]=memo[pr][zost]+eval(pr,zost-1); return memo[pr][zost]; } pair solve(int ind) { // cout< curA=solve(P[ind].right); pair curB=solve(P[ind].left); pair ans; ans.se=curA.se+curB.se+1; ans.fi=eval(curA.se+1,curB.se)*curA.fi*curB.fi; // cout<<"zlava : "< cur=solve(P[ind].left); cur.se++; return cur; }else if (P[ind].right!=-1&&P[ind].left==-1) { pair cur=solve(P[ind].right); cur.se++; return cur; }else { return mp(BigInt(1),1); } } int NN; int main() { memset(SEEN,0,sizeof(SEEN)); REP(i,103)choose[i][0]=choose[i][i]=BigInt(1); REP(i,103) REP(j,i) { choose[i+1][j+1]=choose[i][j]+choose[i][j+1]; } while(scanf("%d",&NN),NN) { REP(i,200) P[i].val=P[i].left=P[i].right=-1; pocet=0; REP(i,NN) { int v; scanf("%d",&v); vloz(0,v); } cout<