#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <cassert>
using namespace std;
struct Triple {
unsigned int values[3];
Triple(unsigned int newA, unsigned int newB, unsigned int newC)
: values{newA, newB, newC} {}
unsigned int a() const { return values[0]; }
unsigned int b() const { return values[1]; }
unsigned int c() const { return values[2]; }
unsigned int sum() const { return accumulate(values, values + 3, 0); }
bool operator<(const Triple& second) const {
return lexicographical_compare(values, values + 3,
second.values, second.values + 3);
}
};
Triple getTriple(unsigned int k, unsigned int m, unsigned int n) {
assert(m > n);
return {k*(m*m-n*n), k*2*m*n, k*(m*m + n*n)};
}
set<unsigned int> factors(unsigned int n) {
set<unsigned int> res;
unsigned int root = sqrt(n);
for(unsigned int i = 1; i <= root; i++) {
if(n % i == 0) {
res.insert(i);
res.insert(n/i);
}
}
return res;
}
set<Triple> triangles(unsigned int sum) {
auto factorSet = factors(sum);
set<Triple> results;
for(unsigned int k : factorSet)
for(unsigned int m : factorSet) {
unsigned int n = sum/(2*m*k) - m;
if( !n || !((m - n) % 2) || (n >= m) || k*2*m*m >= sum)
continue;
Triple triple = getTriple(k, m, n);
if(triple.sum() == sum)
results.insert(triple);
}
return results;
}
int main(int argc, char** argv) {
unsigned int amount;
if(argc != 2) {
cin >> amount;
}
else {
stringstream ss(argv[1]);
ss >> amount;
}
auto results = triangles(amount);
for(auto& triple : results) {
cout << triple.a() << " " << triple.b() << " " << triple.c() << "\n";
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y2Fzc2VydD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApzdHJ1Y3QgVHJpcGxlIHsKICAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWVzWzNdOwogICAgICAgIFRyaXBsZSh1bnNpZ25lZCBpbnQgbmV3QSwgdW5zaWduZWQgaW50IG5ld0IsIHVuc2lnbmVkIGludCBuZXdDKSAKICAgICAgICAgOiB2YWx1ZXN7bmV3QSwgbmV3QiwgbmV3Q30ge30KICAgICAgICB1bnNpZ25lZCBpbnQgYSgpIGNvbnN0ICB7IHJldHVybiB2YWx1ZXNbMF07IH0KICAgICAgICB1bnNpZ25lZCBpbnQgYigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlc1sxXTsgfQogICAgICAgIHVuc2lnbmVkIGludCBjKCkgY29uc3QgeyByZXR1cm4gdmFsdWVzWzJdOyB9CiAgICAgICAgdW5zaWduZWQgaW50IHN1bSgpIGNvbnN0IHsgcmV0dXJuIGFjY3VtdWxhdGUodmFsdWVzLCB2YWx1ZXMgKyAzLCAwKTsgfQogICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFRyaXBsZSYgc2Vjb25kKSBjb25zdCB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUodmFsdWVzLCB2YWx1ZXMgKyAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZC52YWx1ZXMsIHNlY29uZC52YWx1ZXMgKyAzKTsKICAgICAgICB9Cn07CiAKVHJpcGxlIGdldFRyaXBsZSh1bnNpZ25lZCBpbnQgaywgdW5zaWduZWQgaW50IG0sIHVuc2lnbmVkIGludCBuKSB7CiAgICAgICAgYXNzZXJ0KG0gPiBuKTsKICAgICAgICByZXR1cm4ge2sqKG0qbS1uKm4pLCBrKjIqbSpuLCBrKihtKm0gKyBuKm4pfTsKfQogCnNldDx1bnNpZ25lZCBpbnQ+IGZhY3RvcnModW5zaWduZWQgaW50IG4pIHsKICAgICAgICBzZXQ8dW5zaWduZWQgaW50PiByZXM7CiAgICAgICAgdW5zaWduZWQgaW50IHJvb3QgPSBzcXJ0KG4pOwogICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaSA9IDE7IGkgPD0gcm9vdDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZihuICUgaSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5pbnNlcnQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5pbnNlcnQobi9pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKfQogCnNldDxUcmlwbGU+IHRyaWFuZ2xlcyh1bnNpZ25lZCBpbnQgc3VtKSB7CiAgICAgICAgYXV0byBmYWN0b3JTZXQgPSBmYWN0b3JzKHN1bSk7CiAgICAgICAgc2V0PFRyaXBsZT4gcmVzdWx0czsKICAgICAgICBmb3IodW5zaWduZWQgaW50IGsgOiBmYWN0b3JTZXQpCiAgICAgICAgZm9yKHVuc2lnbmVkIGludCBtIDogZmFjdG9yU2V0KSB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbiA9IHN1bS8oMiptKmspIC0gbTsKICAgICAgICAgICAgICAgIGlmKCAhbiB8fCAhKChtIC0gbikgJSAyKSB8fCAobiA+PSBtKSB8fCBrKjIqbSptID49IHN1bSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgICAgIFRyaXBsZSB0cmlwbGUgPSBnZXRUcmlwbGUoaywgbSwgbik7CiAgICAgICAgICAgICAgICBpZih0cmlwbGUuc3VtKCkgPT0gc3VtKQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmluc2VydCh0cmlwbGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKfQogCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgICAgIHVuc2lnbmVkIGludCBhbW91bnQ7CiAgICAgICAgaWYoYXJnYyAhPSAyKSB7CiAgICAgICAgICAgICAgICBjaW4gPj4gYW1vdW50OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHN0cmluZ3N0cmVhbSBzcyhhcmd2WzFdKTsKICAgICAgICAgICAgICAgIHNzID4+IGFtb3VudDsKICAgICAgICB9CiAgICAgICAgYXV0byByZXN1bHRzID0gdHJpYW5nbGVzKGFtb3VudCk7CiAgICAgICAgZm9yKGF1dG8mIHRyaXBsZSA6IHJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgdHJpcGxlLmEoKSA8PCAiICIgPDwgdHJpcGxlLmIoKSA8PCAiICIgPDwgdHJpcGxlLmMoKSA8PCAiXG4iOwogICAgICAgIH0KfQ==