#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstdint>
typedef std::vector<std::uint64_t> DType;
typedef std::vector<DType> RType;
RType MakeHoge(std::size_t N) {
RType R;
R.reserve(2500);
for (std::uint64_t i = 1; i <= N; i++) {
for (std::uint64_t j = 1; j <= N; j++) {
double V1 = std::hypot(i, j);
if (V1 == std::floor(V1) ){
for (std::uint64_t k = 1; k <= N; k++) {
double V2 = std::hypot(i, k);
double V3 = std::hypot(j, k);
if ((V2 == std::floor(V2)) && (V3 == std::floor(V3))) {
R.push_back({ i,j,k });
}
}
}
}
}
for (auto& o : R) {
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(RType& R) {
std::uint64_t c = 0;
for (auto& oo : R) {
std::cout << ++c << ':';
for (auto& o : oo) {
std::cout << o << ',';
}
std::cout << std::endl;
}
return true;
}
int main() {
RType R;
R = MakeHoge(10000);
Show(R);
return 0;
}
/** /
/** /
bool Adder(DType& D, std::uint64_t R) {
if (D.size() == 0)return false;
D[0]++;
bool C = false;
for (std::size_t i = 0; i < D.size(); i++) {
if (C == true) {
D[i]++;
C = false;
}
if (D[i] >= R-1) {
D[i] = 0;
C = true;
}else {
break;
}
}
return C;
}
/** /
double Hypot3(double X, double Y, double Z) {//C++17 have default this.that is more better
return sqrt(X*X + Y*Y + Z*Z);
}
RType SelectFor3D(const std::uint64_t& Rad) {
DType D{ 0,1,1 };
RType R;
for (std::size_t i = 1; i <= Rad; i++) {
for (std::size_t j = 1; j <= Rad; j++) {
std::uint64_t V = std::hypot(i,j);
if (i*i+j*j==V*V) {
for (std::size_t k = 1; k <= Rad; k++) {
//std::cout << i << ',' << j << ',' << k <<" "<<'\r';
double V = Hypot3(i, j, k);
if (V == std::floor(V)) {
R.push_back({i,j,k});
}
}
}
}
}
for (auto& o : R) {
std::sort(o.begin(), o.end());
}
std::sort(R.begin(), R.end());
R.erase(std::unique(R.begin(), R.end()), R.end());
return R;
}
RType SelectFor2D(RType& D) {
RType R;
bool F = false;
for (auto& o : D) {
std::sort(o.begin(), o.end());
F == false;
do {
double V = std::hypot(o[0], o[1]);
if (V != std::floor(V)) {
F = true;
break;
}
} while (std::next_permutation(o.begin(),o.end()));
if (F == false) {
R.push_back(o);
}
}
return R;
}
RType MakeHoge(const std::uint64_t& Rad) {
RType R;
std::cout << "start 篩 by 3D" << std::endl;
R = SelectFor3D(Rad);
Show(R);
std::cout << "start 篩 by 2D" << std::endl;
R = SelectFor2D(R);
return R;
}
int main()
{
RType R;
R = MakeHoge(10000);
Show(R);
return 0;
}
*/
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjc3RkaW50Pgp0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6dWludDY0X3Q+IERUeXBlOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPERUeXBlPiBSVHlwZTsKClJUeXBlIE1ha2VIb2dlKHN0ZDo6c2l6ZV90IE4pIHsKCVJUeXBlIFI7CglSLnJlc2VydmUoMjUwMCk7Cglmb3IgKHN0ZDo6dWludDY0X3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CgkJZm9yIChzdGQ6OnVpbnQ2NF90IGogPSAxOyBqIDw9IE47IGorKykgewoJCQlkb3VibGUgVjEgPSBzdGQ6Omh5cG90KGksIGopOwoJCQlpZiAoVjEgPT0gc3RkOjpmbG9vcihWMSkgKXsKCQkJCWZvciAoc3RkOjp1aW50NjRfdCBrID0gMTsgayA8PSBOOyBrKyspIHsKCQkJCQlkb3VibGUgVjIgPSBzdGQ6Omh5cG90KGksIGspOwoJCQkJCWRvdWJsZSBWMyA9IHN0ZDo6aHlwb3Qoaiwgayk7CgkJCQkJaWYgKChWMiA9PSBzdGQ6OmZsb29yKFYyKSkgJiYgKFYzID09IHN0ZDo6Zmxvb3IoVjMpKSkgewoJCQkJCQlSLnB1c2hfYmFjayh7IGksaixrIH0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChhdXRvJiBvIDogUikgewoJCXN0ZDo6c29ydChvLmJlZ2luKCksIG8uZW5kKCkpOwoJfQoJc3RkOjpzb3J0KFIuYmVnaW4oKSwgUi5lbmQoKSk7CgoJUi5lcmFzZShzdGQ6OnVuaXF1ZShSLmJlZ2luKCksIFIuZW5kKCkpLCBSLmVuZCgpKTsKCglyZXR1cm4gUjsKCn0KYm9vbCBTaG93KFJUeXBlJiBSKSB7CglzdGQ6OnVpbnQ2NF90IGMgPSAwOwoJZm9yIChhdXRvJiBvbyA6IFIpIHsKCQlzdGQ6OmNvdXQgPDwgKytjIDw8ICc6JzsKCQlmb3IgKGF1dG8mIG8gOiBvbykgewoJCQlzdGQ6OmNvdXQgPDwgbyA8PCAnLCc7CgkJfQoJCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cgl9CglyZXR1cm4gdHJ1ZTsKfQppbnQgbWFpbigpIHsKCVJUeXBlIFI7CgoJUiA9IE1ha2VIb2dlKDEwMDAwKTsKCVNob3coUik7CgoJcmV0dXJuIDA7Cn0KCi8qKiAvCi8qKiAvCmJvb2wgQWRkZXIoRFR5cGUmIEQsIHN0ZDo6dWludDY0X3QgUikgewoJaWYgKEQuc2l6ZSgpID09IDApcmV0dXJuIGZhbHNlOwoJRFswXSsrOwoJYm9vbCBDID0gZmFsc2U7Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRC5zaXplKCk7IGkrKykgewoJCWlmIChDID09IHRydWUpIHsKCQkJRFtpXSsrOwoJCQlDID0gZmFsc2U7CgkJfQoJCQoJCWlmIChEW2ldID49IFItMSkgewoJCQlEW2ldID0gMDsKCQkJQyA9IHRydWU7CgkJfWVsc2UgewoJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIEM7Cn0KCi8qKiAvCmRvdWJsZSBIeXBvdDMoZG91YmxlIFgsIGRvdWJsZSBZLCBkb3VibGUgWikgey8vQysrMTcgaGF2ZSBkZWZhdWx0IHRoaXMudGhhdCBpcyBtb3JlIGJldHRlcgoJcmV0dXJuIHNxcnQoWCpYICsgWSpZICsgWipaKTsKfQpSVHlwZSBTZWxlY3RGb3IzRChjb25zdCBzdGQ6OnVpbnQ2NF90JiBSYWQpIHsKCURUeXBlIER7IDAsMSwxIH07CglSVHlwZSBSOwoJCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDw9IFJhZDsgaSsrKSB7CgkJZm9yIChzdGQ6OnNpemVfdCBqID0gMTsgaiA8PSBSYWQ7IGorKykgewoJCQlzdGQ6OnVpbnQ2NF90IFYgPSBzdGQ6Omh5cG90KGksaik7CgkJCWlmIChpKmkraipqPT1WKlYpIHsKCQkJCWZvciAoc3RkOjpzaXplX3QgayA9IDE7IGsgPD0gUmFkOyBrKyspIHsKCQkJCQkvL3N0ZDo6Y291dCA8PCBpIDw8ICcsJyA8PCBqIDw8ICcsJyA8PCBrIDw8IiAgIjw8J1xyJzsKCQkJCQlkb3VibGUgViA9IEh5cG90MyhpLCBqLCBrKTsKCQkJCQlpZiAoViA9PSBzdGQ6OmZsb29yKFYpKSB7CgkJCQkJCVIucHVzaF9iYWNrKHtpLGosa30pOwoJCQkJCX0KCgkJCQl9CgkJCX0KCgkJfQoJfQoKCWZvciAoYXV0byYgbyA6IFIpIHsKCQlzdGQ6OnNvcnQoby5iZWdpbigpLCBvLmVuZCgpKTsKCX0KCXN0ZDo6c29ydChSLmJlZ2luKCksIFIuZW5kKCkpOwoKCVIuZXJhc2Uoc3RkOjp1bmlxdWUoUi5iZWdpbigpLCBSLmVuZCgpKSwgUi5lbmQoKSk7CgoJCgoJCXJldHVybiBSOwp9CgpSVHlwZSBTZWxlY3RGb3IyRChSVHlwZSYgRCkgewoJUlR5cGUgUjsKCWJvb2wgRiA9IGZhbHNlOwoJZm9yIChhdXRvJiBvIDogRCkgewoJCXN0ZDo6c29ydChvLmJlZ2luKCksIG8uZW5kKCkpOwoJCUYgPT0gZmFsc2U7CgkJZG8gewoJCQlkb3VibGUgViA9IHN0ZDo6aHlwb3Qob1swXSwgb1sxXSk7CgkJCWlmIChWICE9IHN0ZDo6Zmxvb3IoVikpIHsKCQkJCUYgPSB0cnVlOwoJCQkJYnJlYWs7CgkJCX0KCQl9IHdoaWxlIChzdGQ6Om5leHRfcGVybXV0YXRpb24oby5iZWdpbigpLG8uZW5kKCkpKTsKCQlpZiAoRiA9PSBmYWxzZSkgewoJCQlSLnB1c2hfYmFjayhvKTsKCQl9Cgl9CglyZXR1cm4gUjsKfQoKUlR5cGUgTWFrZUhvZ2UoY29uc3Qgc3RkOjp1aW50NjRfdCYgUmFkKSB7CglSVHlwZSBSOwoJc3RkOjpjb3V0IDw8ICJzdGFydCDnr6kgYnkgM0QiIDw8IHN0ZDo6ZW5kbDsKCVIgPSBTZWxlY3RGb3IzRChSYWQpOwoJU2hvdyhSKTsKCXN0ZDo6Y291dCA8PCAic3RhcnQg56+pIGJ5IDJEIiA8PCBzdGQ6OmVuZGw7CglSID0gU2VsZWN0Rm9yMkQoUik7CgoJcmV0dXJuIFI7Cgp9CgppbnQgbWFpbigpCnsKCVJUeXBlIFI7CgoJUiA9IE1ha2VIb2dlKDEwMDAwKTsKCVNob3coUik7CgogICAgcmV0dXJuIDA7Cn0KKi8=