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