47 lines
1.3 KiB
C++
47 lines
1.3 KiB
C++
|
#include <iostream>
|
||
|
#include <cmath>
|
||
|
#include <chrono>
|
||
|
#define pmax 1000000000ll
|
||
|
|
||
|
using namespace std;
|
||
|
typedef long long var;
|
||
|
|
||
|
template<typename T> 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<double> elapsed_seconds = end-start;
|
||
|
cout << "solving took: " << elapsed_seconds.count() << endl;
|
||
|
cout << "perimeter count: " << count << endl;
|
||
|
|
||
|
cout << "perimeter sum: " << perimeterSum;
|
||
|
return 0;
|
||
|
}
|