#include <algorithm>
#include <iostream>
#include <iterator>
struct triple_t
{
unsigned x;
unsigned y;
unsigned z;
};
std::ostream & operator<<(std::ostream & out, triple_t const & triple)
{
return out << triple.x << ", " << triple.y << ", " << triple.z;
}
class triple_iterator_t : public std::iterator<std::forward_iterator_tag, triple_t>
{
private:
triple_t triple_;
static triple_t next(unsigned x, unsigned y, unsigned z)
{
while (true)
{
while (true)
{
while (true)
{
if (y == z) break;
++y;
if (x * x + y * y == z * z) return {x, y, z};
}
if (x == z) break;
++x;
y = x;
}
++z;
x = 1;
}
}
public:
triple_iterator_t() : triple_{1, 1, 1}
{
++(*this);
}
triple_t operator *()
{
return triple_;
}
triple_iterator_t & operator ++()
{
triple_ = next(triple_.x, triple_.y, triple_.z);
return *this;
}
};
int main()
{
copy_n(triple_iterator_t(), 10, std::ostream_iterator<triple_t>(std::cout, "\n"));
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CgpzdHJ1Y3QgdHJpcGxlX3QKewoJdW5zaWduZWQgeDsKCXVuc2lnbmVkIHk7Cgl1bnNpZ25lZCB6Owp9OwoKc3RkOjpvc3RyZWFtICYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJiBvdXQsIHRyaXBsZV90IGNvbnN0ICYgdHJpcGxlKQp7CglyZXR1cm4gb3V0IDw8IHRyaXBsZS54IDw8ICIsICIgPDwgdHJpcGxlLnkgPDwgIiwgIiA8PCB0cmlwbGUuejsKfQoKY2xhc3MgdHJpcGxlX2l0ZXJhdG9yX3QgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0cmlwbGVfdD4Kewpwcml2YXRlOgoJdHJpcGxlX3QgdHJpcGxlXzsKCglzdGF0aWMgdHJpcGxlX3QgbmV4dCh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCB1bnNpZ25lZCB6KQoJewoJCXdoaWxlICh0cnVlKQoJCXsKCQkJd2hpbGUgKHRydWUpCgkJCXsKCQkJCXdoaWxlICh0cnVlKQoJCQkJewkJCQkJCgkJCQkJaWYgKHkgPT0geikgYnJlYWs7CgkJCQkJKyt5OwoJCQkJCWlmICh4ICogeCArIHkgKiB5ID09IHogKiB6KSByZXR1cm4ge3gsIHksIHp9OwoJCQkJfQoJCQkJaWYgKHggPT0geikgYnJlYWs7CgkJCQkrK3g7CgkJCQl5ID0geDsKCQkJfQoJCQkrK3o7CgkJCXggPSAxOwoJCX0JCgl9CgpwdWJsaWM6Cgl0cmlwbGVfaXRlcmF0b3JfdCgpIDogdHJpcGxlX3sxLCAxLCAxfQoJewoJCSsrKCp0aGlzKTsKCX0KCQkKCXRyaXBsZV90IG9wZXJhdG9yICooKQoJewoJCXJldHVybiB0cmlwbGVfOwoJfQoKCXRyaXBsZV9pdGVyYXRvcl90ICYgb3BlcmF0b3IgKysoKQoJewoJCXRyaXBsZV8gPSBuZXh0KHRyaXBsZV8ueCwgdHJpcGxlXy55LCB0cmlwbGVfLnopOwoJCXJldHVybiAqdGhpczsKCX0KfTsKCmludCBtYWluKCkKewoJY29weV9uKHRyaXBsZV9pdGVyYXRvcl90KCksIDEwLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8dHJpcGxlX3Q+KHN0ZDo6Y291dCwgIlxuIikpOwp9
3, 4, 5
6, 8, 10
5, 12, 13
9, 12, 15
8, 15, 17
12, 16, 20
7, 24, 25
15, 20, 25
10, 24, 26
20, 21, 29