#include #include #include #include using namespace std; struct fa { int n; fa *kov[51]; int p[50]; }; fa gyoker; ifstream in("nunta.in"); ofstream out("nunta.out"); vector result; void readData() { if(in) { in >> gyoker.n; for(int i=1;i<=gyoker.n;i++) in >> gyoker.p[i]; } for(int i=1;i<=gyoker.n;i++) gyoker.kov[i]=0; } bool vege(fa *l) { if(l->n == 1) return 1; //ha egy kero van akkor a vegere ertunk else { int i; for(i=1;i<= l->n;i++) if(l->kov[i]!=0) break; //leallunk az elso kiterjesztett szintnel if (l->kov[i]!=0) return vege(l->kov[i]); else return false; } } void kiterjeszt(fa *l) { if(l->kov[1]==0) { for(int i=1;i<=l->n-1;i++) //n-1 szint lessz { l->kov[i]=new fa(); l->kov[i]->n = l->n-1; //egy kero ki fog esni for(int j=1;j<=i-1;j++) l->kov[i]->p[j] = l->p[j];//az elotte levoket atmasoljuk if(l->p[i]>l->p[i+1]) { l->kov[i]->p[i]=l->p[i] - l->p[i+1]; //ha neki van tobb akkor lefizeti a masikat } else { l->kov[i]->p[i]= l->p[i+1] - l->p[i]; //ha neki van kevesebb vagy ugyanannyi,ot fizetik le } for(int j=i+2;j<=l->n;j++) l->kov[i]->p[j-1] = l->p[j];//az utana levoket is valtozatlanul atmasoljuk for(int j=1;j<=l->kov[i]->n;j++) l->kov[i]->kov[j] = 0; //ures legyen a kovetkezonek a kovetkezoje is } } else { for(int i=1;i<=l->n;i++) if (l->kov[i]!=0) kiterjeszt(l->kov[i]); } } void getResult(fa *l) { if(l!=0) { /*cout << l->n<<":"; for(int i=1;i<=l->n;i++) cout << l->p[i]; cout << "\n";*/ if(l->n==1) { if(find(result.begin(),result.end(),l->p[1])==result.end()) //ha meg nincs benne az eredmenyvektorba { //cout << l->p[1]; result.push_back(l->p[1]); } } if(l->kov[1]!=0) { for(int i=1;i<=l->n;i++) if(l->kov[i]!=0) getResult(l->kov[i]); } } } void writeResult() { out << result.size()<