// div22.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <cstdint>
#include <vector>
#include <algorithm>
typedef std::vector<std::uint64_t> DType;
typedef std::vector<DType> RType;
bool Adder(DType& D, std::uint64_t R) {
if (D.size() == 0)return false;
D[0]++;
bool F = false;
for (std::size_t i = 0; i < D.size(); i++) {
if (F == true) {
D[i]++;
F = false;
}
F = false;
if (D[i] >= R) {
D[i] = 0;
F = true;
}else{
break;
}
}
return F;
}
RType MakeHoge(std::uint64_t N) {
if (N == 0)return RType();
DType D(2);
std::uint64_t C=0;
RType R;
double I = 0;
std::uint64_t V = 0;
while (D.size()!=N+1) {
L:
if (Adder(D, N - (D.size()-1)) == true) {
D.push_back(0);
continue;
}
C = 0;
//std::cout << N - (D.size() - 1) <<' '<< V++ << "\r";
for (auto& o : D) {
C += o;
if (C > N)goto L;
}
I = 0;
for (auto& o : D) {
if (o == 0)continue;
I += (1.0 / o);
}
if (I == 1.0)R.push_back(D);
}
for (auto& o : R) {
for (std::size_t i = o.size(); i < N; i++)o.push_back(0);
std::sort(o.begin(), o.end());
}
std::sort(R.begin(), R.end());
R.erase(std::unique(R.begin(), R.end()), R.end());
return R;
}
bool Show(const RType& R) {
for (auto& oo : R) {
for (auto& o : oo) {
if (o == 0)continue;
std::cout << o << ',';
}
std::cout << std::endl;
}
return true;
}
int main()
{
RType R;
R = MakeHoge(22);
Show(R);
return 0;
}
Ly8gZGl2MjIuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgovLwojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQ2NF90PiBEVHlwZTsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxEVHlwZT4gUlR5cGU7CmJvb2wgQWRkZXIoRFR5cGUmIEQsIHN0ZDo6dWludDY0X3QgUikgewoJaWYgKEQuc2l6ZSgpID09IDApcmV0dXJuIGZhbHNlOwoJRFswXSsrOwoJYm9vbCBGID0gZmFsc2U7Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRC5zaXplKCk7IGkrKykgewoJCWlmIChGID09IHRydWUpIHsKCQkJRFtpXSsrOwoJCQlGID0gZmFsc2U7CgkJfQoJCUYgPSBmYWxzZTsKCQlpZiAoRFtpXSA+PSBSKSB7CgkJCURbaV0gPSAwOwoJCQlGID0gdHJ1ZTsKCQl9ZWxzZXsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuIEY7Cn0KClJUeXBlIE1ha2VIb2dlKHN0ZDo6dWludDY0X3QgTikgewoJaWYgKE4gPT0gMClyZXR1cm4gUlR5cGUoKTsKCURUeXBlIEQoMik7CglzdGQ6OnVpbnQ2NF90IEM9MDsKCVJUeXBlIFI7Cglkb3VibGUgSSA9IDA7CglzdGQ6OnVpbnQ2NF90IFYgPSAwOwoJd2hpbGUgKEQuc2l6ZSgpIT1OKzEpIHsKCQlMOgoJCWlmIChBZGRlcihELCBOIC0gKEQuc2l6ZSgpLTEpKSA9PSB0cnVlKSB7CgkJCUQucHVzaF9iYWNrKDApOwoJCQljb250aW51ZTsKCQl9CgkJQyA9IDA7CgkJLy9zdGQ6OmNvdXQgPDwgTiAtIChELnNpemUoKSAtIDEpIDw8JyAnPDwgVisrIDw8ICJcciI7CgkJZm9yIChhdXRvJiBvIDogRCkgewoJCQlDICs9IG87CgkJCWlmIChDID4gTilnb3RvIEw7CgkJfQoJCUkgPSAwOwoJCWZvciAoYXV0byYgbyA6IEQpIHsKCQkJaWYgKG8gPT0gMCljb250aW51ZTsKCQkJSSArPSAoMS4wIC8gbyk7CgkJfQoJCWlmIChJID09IDEuMClSLnB1c2hfYmFjayhEKTsKCX0KCglmb3IgKGF1dG8mIG8gOiBSKSB7CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gby5zaXplKCk7IGkgPCBOOyBpKyspby5wdXNoX2JhY2soMCk7CgkJc3RkOjpzb3J0KG8uYmVnaW4oKSwgby5lbmQoKSk7Cgl9CglzdGQ6OnNvcnQoUi5iZWdpbigpLCBSLmVuZCgpKTsKCVIuZXJhc2Uoc3RkOjp1bmlxdWUoUi5iZWdpbigpLCBSLmVuZCgpKSwgUi5lbmQoKSk7CgoKCXJldHVybiBSOwoKfQoKYm9vbCBTaG93KGNvbnN0IFJUeXBlJiBSKSB7Cglmb3IgKGF1dG8mIG9vIDogUikgewoJCWZvciAoYXV0byYgbyA6IG9vKSB7CgkJCWlmIChvID09IDApY29udGludWU7CgkJCXN0ZDo6Y291dCA8PCBvIDw8ICcsJzsKCQl9CgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCX0KCXJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpCnsKCVJUeXBlIFI7CgoJUiA9IE1ha2VIb2dlKDIyKTsKCVNob3coUik7CiAgICByZXR1cm4gMDsKfQ==