project-euler

https://projecteuler.net/
Log | Files | Refs | README

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 }