#include <iostream>
#include <vector>
using namespace std;
// В качестве первого слагаемого мы можем выбрать любое число K
// из диапазова [1..N]. Тогда останется решить задачу размера
// N-K при условиии что максимальное слагаемое будет не больше
// чем выбранное на данном шаге
namespace {
void PrintArray(const vector<unsigned int> &acc)
{
for (unsigned int i = 0; i < acc.size(); ++i) {
if (i) {
cout << " + ";
}
cout << acc[i];
}
cout << "\n";
}
void Helper(vector<unsigned int>& acc, unsigned int max, unsigned int remain) {
if (remain == 0) {
PrintArray(acc);
return;
}
acc.push_back(0);
for (auto i = std::min(max, remain); i > 0; --i) {
acc.back() = i;
Helper(acc, i, remain - i);
}
acc.pop_back();
}
}
void PrintAllPartitions(unsigned int N)
{
vector<unsigned int> res;
res.reserve(N);
Helper(res, N , N);
}
int main()
{
PrintAllPartitions(4);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vINCSINC60LDRh9C10YHRgtCy0LUg0L/QtdGA0LLQvtCz0L4g0YHQu9Cw0LPQsNC10LzQvtCz0L4g0LzRiyDQvNC+0LbQtdC8INCy0YvQsdGA0LDRgtGMINC70Y7QsdC+0LUg0YfQuNGB0LvQviBLCi8vINC40Lcg0LTQuNCw0L/QsNC30L7QstCwIFsxLi5OXS4g0KLQvtCz0LTQsCDQvtGB0YLQsNC90LXRgtGB0Y8g0YDQtdGI0LjRgtGMINC30LDQtNCw0YfRgyDRgNCw0LfQvNC10YDQsAovLyBOLUsg0L/RgNC4INGD0YHQu9C+0LLQuNC40Lgg0YfRgtC+INC80LDQutGB0LjQvNCw0LvRjNC90L7QtSDRgdC70LDQs9Cw0LXQvNC+0LUg0LHRg9C00LXRgiDQvdC1INCx0L7Qu9GM0YjQtQovLyDRh9C10Lwg0LLRi9Cx0YDQsNC90L3QvtC1INC90LAg0LTQsNC90L3QvtC8INGI0LDQs9C1CgoKbmFtZXNwYWNlIHsKCnZvaWQgUHJpbnRBcnJheShjb25zdCB2ZWN0b3I8dW5zaWduZWQgaW50PiAmYWNjKQp7CiAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGFjYy5zaXplKCk7ICsraSkgewogICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIiArICI7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgYWNjW2ldOwogICAgfQogICAgY291dCA8PCAiXG4iOwp9Cgp2b2lkIEhlbHBlcih2ZWN0b3I8dW5zaWduZWQgaW50PiYgYWNjLCB1bnNpZ25lZCBpbnQgbWF4LCB1bnNpZ25lZCBpbnQgcmVtYWluKSB7CiAgICBpZiAocmVtYWluID09IDApIHsKICAgICAgICBQcmludEFycmF5KGFjYyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGFjYy5wdXNoX2JhY2soMCk7CgogICAgZm9yIChhdXRvIGkgPSBzdGQ6Om1pbihtYXgsIHJlbWFpbik7IGkgPiAwOyAtLWkpIHsKICAgICAgICBhY2MuYmFjaygpID0gaTsKICAgICAgICBIZWxwZXIoYWNjLCBpLCByZW1haW4gLSBpKTsKICAgIH0KCiAgICBhY2MucG9wX2JhY2soKTsKfQoKfQoKdm9pZCBQcmludEFsbFBhcnRpdGlvbnModW5zaWduZWQgaW50IE4pCnsKICAgIHZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHJlczsKICAgIHJlcy5yZXNlcnZlKE4pOwogICAgSGVscGVyKHJlcywgTiAsIE4pOwp9CgoKaW50IG1haW4oKQp7CiAgICBQcmludEFsbFBhcnRpdGlvbnMoNCk7CiAgICByZXR1cm4gMDsKfQ==