rendered paste body#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct fa
{
int n;
fa *kov[51];
int p[50];
};
fa gyoker;
ifstream in("nunta.in");
ofstream out("nunta.out");
vector <int> 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()<<endl;
for(int i=0;i<=result.size()-1;i++)
{
out << result[i] <<" ";
}
}
int main()
{
readData();
while(!vege(&gyoker))
{
kiterjeszt(&gyoker);
}
getResult(&gyoker);
sort(result.begin(),result.end());
writeResult();
return 0;
}