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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <bits/stdc++.h>
using namespace std;

int main() {


	cin.tie(NULL);
	cout.tie(NULL);
	ios_base::sync_with_stdio(false);

	unordered_map<int, vector<pair<int, int>>> pairsMap;
	unordered_map<int, vector<int>> diagonalToHsMap;
	set<set<int>> dimsSet;

	int n;
	cin >> n;
//	n = 7;


	for (int i = 1; i <= n; i++) {
		for (int j = i; j <= n; j++) {
			pairsMap[i * i + j * j].push_back( { i, j });
		}
	}

	int baseDiagonal;
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j < i; j++) {
			baseDiagonal = i * i - j * j;
			if (pairsMap.count(baseDiagonal) > 0) {
				diagonalToHsMap[baseDiagonal].push_back(j);
			}
		}
	}

	long long int result = 0;
	int a, b;
	for (auto diagWithHs : diagonalToHsMap) {
		int dialgonal = diagWithHs.first;
		vector<int> heights = diagWithHs.second;
		vector<pair<int, int>> baseSizes = pairsMap[dialgonal];
		for (pair<int, int> baseSize : baseSizes) {
			a = baseSize.first;
			b = baseSize.second;
			for (int h : heights) {
				dimsSet.insert( { a, b, h });
			}
		}
	}

	for (set<int> dims : dimsSet) {
		result += dims.size();
	}

	cout << result << endl;

	return 0;
}