Euler_75.cpp (923B)
1 #include <algorithm> 2 3 #include "Euler.h" 4 5 int Euler::UniquePerimeterRightAngledTriangles() 6 { 7 llui ceiling = 1500000; 8 double sqrtCeiling = sqrt(ceiling); 9 std::vector<int> perimeters(ceiling + 1, 0); 10 11 for (llui m = 2; m <= sqrtCeiling; ++m) 12 { 13 for (llui n = 1; n < m; ++n) 14 { 15 if (((m - n) & 1) && (EulerUtility::gcd(m,n) == 1)) 16 { 17 llui m2 = pow(m, 2); 18 llui n2 = pow(n, 2); 19 20 if (m2 + n2 >= ceiling) 21 { 22 continue; 23 } 24 25 llui perimeter = (m2 - n2) + (2 * m * n) + (m2 + n2); 26 27 int k = 1; 28 29 while (perimeter * k <= ceiling) 30 { 31 ++perimeters[perimeter * k]; 32 ++k; 33 } 34 } 35 } 36 } 37 38 return std::count(perimeters.begin(), perimeters.end(), 1); 39 }