#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstdint>
typedef std::vector<double> DType;
typedef std::vector<DType> RType;
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;
while (!Adder(D,Rad)){
// std::cout << D[0] << ',' << D[1] << ',' << D[2] << '\r';
double V = Hypot3(D[0], D[1], D[2]);
if (V == std::floor(V)) {
R.push_back(D);
}
}
return R;
}
RType SelectFor2D(RType& D) {
RType R;
bool F = false;
for (auto& o : D) {
std::sort(o.begin(), o.end());
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 == true) {
R.push_back(o);
}
}
return R;
}
bool Show(RType& R) {
for (auto& oo : R) {
for (auto& o : oo) {
std::cout << o << ',';
}
std::cout << std::endl;
}
return true;
}
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(10001);
Show(R);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjc3RkaW50Pgp0eXBlZGVmIHN0ZDo6dmVjdG9yPGRvdWJsZT4gRFR5cGU7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8RFR5cGU+IFJUeXBlOwoKYm9vbCBBZGRlcihEVHlwZSYgRCwgc3RkOjp1aW50NjRfdCBSKSB7CglpZiAoRC5zaXplKCkgPT0gMClyZXR1cm4gZmFsc2U7CglEWzBdKys7Cglib29sIEMgPSBmYWxzZTsKCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBELnNpemUoKTsgaSsrKSB7CgkJaWYgKEMgPT0gdHJ1ZSkgewoJCQlEW2ldKys7CgkJCUMgPSBmYWxzZTsKCQl9CgkJCgkJaWYgKERbaV0gPj0gUi0xKSB7CgkJCURbaV0gPSAwOwoJCQlDID0gdHJ1ZTsKCQl9ZWxzZSB7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gQzsKfQoKCmRvdWJsZSBIeXBvdDMoZG91YmxlIFgsIGRvdWJsZSBZLCBkb3VibGUgWikgey8vQysrMTcgaGF2ZSBkZWZhdWx0IHRoaXMudGhhdCBpcyBtb3JlIGJldHRlcgoJcmV0dXJuIHNxcnQoWCpYICsgWSpZICsgWipaKTsKfQpSVHlwZSBTZWxlY3RGb3IzRChjb25zdCBzdGQ6OnVpbnQ2NF90JiBSYWQpIHsKCURUeXBlIER7IDAsMSwxIH07CglSVHlwZSBSOwoJd2hpbGUgKCFBZGRlcihELFJhZCkpewoJLy8Jc3RkOjpjb3V0IDw8IERbMF0gPDwgJywnIDw8IERbMV0gPDwgJywnIDw8IERbMl0gPDwgJ1xyJzsKCQlkb3VibGUgViA9IEh5cG90MyhEWzBdLCBEWzFdLCBEWzJdKTsKCQlpZiAoViA9PSBzdGQ6OmZsb29yKFYpKSB7CgkJCVIucHVzaF9iYWNrKEQpOwoJCX0KCX0KCXJldHVybiBSOwp9CgpSVHlwZSBTZWxlY3RGb3IyRChSVHlwZSYgRCkgewoJUlR5cGUgUjsKCWJvb2wgRiA9IGZhbHNlOwoJZm9yIChhdXRvJiBvIDogRCkgewoJCXN0ZDo6c29ydChvLmJlZ2luKCksIG8uZW5kKCkpOwoJCWRvIHsKCQkJZG91YmxlIFYgPSBzdGQ6Omh5cG90KG9bMF0sIG9bMV0pOwoJCQlpZiAoViAhPSBzdGQ6OmZsb29yKFYpKSB7CgkJCQlGID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQl9CgkJfSB3aGlsZSAoc3RkOjpuZXh0X3Blcm11dGF0aW9uKG8uYmVnaW4oKSxvLmVuZCgpKSk7CgkJaWYgKEYgPT0gdHJ1ZSkgewoJCQlSLnB1c2hfYmFjayhvKTsKCQl9Cgl9CglyZXR1cm4gUjsKfQpib29sIFNob3coUlR5cGUmIFIpIHsKCWZvciAoYXV0byYgb28gOiBSKSB7CgkJZm9yIChhdXRvJiBvIDogb28pIHsKCQkJc3RkOjpjb3V0IDw8IG8gPDwgJywnOwoJCX0KCQlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJfQoJcmV0dXJuIHRydWU7Cn0KUlR5cGUgTWFrZUhvZ2UoY29uc3Qgc3RkOjp1aW50NjRfdCYgUmFkKSB7CglSVHlwZSBSOwoJc3RkOjpjb3V0IDw8ICJzdGFydCDnr6kgYnkgM0QiIDw8IHN0ZDo6ZW5kbDsKCVIgPSBTZWxlY3RGb3IzRChSYWQpOwoJU2hvdyhSKTsKCXN0ZDo6Y291dCA8PCAic3RhcnQg56+pIGJ5IDJEIiA8PCBzdGQ6OmVuZGw7CglSID0gU2VsZWN0Rm9yMkQoUik7CgoJcmV0dXJuIFI7Cgp9CgppbnQgbWFpbigpCnsKCVJUeXBlIFI7CgoJUiA9IE1ha2VIb2dlKDEwMDAxKTsKCVNob3coUik7CgogICAgcmV0dXJuIDA7Cn0K