#include #include #include #define pmax 1000000000ll using namespace std; typedef long long var; template inline bool isSquare(T val) { T root = (T)sqrt((double)val); return root*root == val; } int main() { auto start = chrono::system_clock::now(); var perimeterSum = 0; var count = 0; for (var equalSide = 3; equalSide <= pmax/3+1; equalSide += 2) { var otherSide = equalSide-1; var s = equalSide + otherSide/2; if (isSquare(s*(s-otherSide)) && 2*s <= pmax) { perimeterSum += 2*s; count++; cout << "(" << equalSide << "," << equalSide << "," << otherSide << ")" << endl; } otherSide = equalSide+1; s = equalSide + otherSide/2; if (isSquare(s*(s-otherSide)) && 2*s <= pmax) { perimeterSum += 2*s; count++; cout << "(" << equalSide << "," << equalSide << "," << otherSide << ")" << endl; } } auto end = std::chrono::system_clock::now(); std::chrono::duration elapsed_seconds = end-start; cout << "solving took: " << elapsed_seconds.count() << endl; cout << "perimeter count: " << count << endl; cout << "perimeter sum: " << perimeterSum; return 0; }