#include <stdlib.h>
#include <stdio.h>
struct t_data {
int max_profit;//最大收益
int times;//切割次数
int values[50];//最多切50段,切好的每段放进来
};
int cmp(const void *a, const void *b) {
return *(int*)a > *(int*)b;
}
int main() {
int i = 0;
int j = 0;
int k = 0;
int x = 0;
scanf("%d", &x);
struct t_data m[51] = {0};
m[1].max_profit = 1;
m[1].times = 0;
m[1].values[0] = 1;
m[2].max_profit = 2;
m[2].times = 0;
m[2].values[0] = 2;
m[3].max_profit = 3;
m[3].times = 0;
m[3].values[0] = 3;
for (i = 4; i <= x; i++) {//从4米一直推导到x米
m[i].max_profit = i;
m[i].times = 0;
m[i].values[0] = i;
for (j = 1; j <= i / 2; j++) {
int current_profit = m[j].max_profit * m[i - j].max_profit;
int current_times = m[j].times + m[i - j].times + 1;
if (current_profit > m[i].max_profit || current_profit == m[i].max_profit && current_times < m[i].times) {
m[i].max_profit = current_profit;
m[i].times = m[j].times + m[i - j].times + 1;
/*把两部分切好的两端合并起来*/
for (k = 0; k <= m[j].times; k++) {
m[i].values[k] = m[j].values[k];
}
for (k = 0; k <= m[i - j].times; k++) {
m[i].values[m[j].times + 1 + k] = m[i - j].values[k];
}
}
}
}
qsort(m[x].values, m[x].times + 1, sizeof(int), cmp);
for (i = 0; i <= m[x].times; i++) {
printf("%d ", m[x].values[i]);
}
}