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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 1000'007;
int il[N];
vector<pair<pair<int, int>, int>> v;

void Solve()
{
    int n;
    cin >> n;
    int lim = 1;
    while((lim + 1) * (lim + 1) <= n) ++lim;
    for(int i = 0; i <= lim; ++i)
        for(int j = 0; j <= lim; ++j)
            for(int k = 0; k <= lim; ++k)
                for(int l = 0; l <= lim; ++l)
                {
                    if((i + j + k + l) % 2 == 0) continue;
                    if(gcd(gcd(i, j), gcd(k, l)) > 1) continue;
                    int a = i * i + j * j - k * k - l * l;
                    int b = 2 * (i * l + j * k);
                    int c = 2 * (j * l - i * k);
                    if(a == 0) continue;
                    if(b == 0) continue;
                    if(c == 0) continue;
                    if(a < 0) a *= -1;
                    if(b < 0) b *= -1;
                    if(c < 0) c *= -1;
                    if(gcd(a, gcd(b, c)) > 1)
                        continue;
                    //cout << "g: " << a << " " << b << " | " << c << "\n";
                    if(i * i + j * j + k * k + l * l > n) continue;

                    v.pb(make_pair(make_pair(a, b), c));
                    v.pb(make_pair(make_pair(a, c), b));
                    v.pb(make_pair(make_pair(c, b), a));
                }

    for(int i = 0; i < (int)v.size(); ++i)
        if(v[i].st.st > v[i].st.nd)
            swap(v[i].st.st, v[i].st.nd);
    sort(v.begin(), v.end());
    ll ans = 0;
    for(int i = 0; i < (int)v.size(); ++i)
    {
        if(i > 0 && v[i] == v[i - 1]) continue;
        int a = v[i].st.st * v[i].st.st + v[i].st.nd * v[i].st.nd + v[i].nd * v[i].nd;
        //cout << v[i].st.st << " " << v[i].st.nd << " | " << v[i].nd << " || " << a << " " << n * n << " " << ans << "\n";
        int x = sqrt(a);
        while(x * x > a) --x;
        while((x + 1) * (x + 1) <= a) ++x;
        ans += (ll)(n / x);
    }
    cout << ans << "\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //int t; cin >> t;
    //while(t--)
        Solve();

    return 0;
}