public class Euler540 {
    static long isqrt(long x) {
        if (x == 0)
            return 0;
        long r = (long) Math.sqrt((double) x);
        while ((r + 1) * (r + 1) <= x && (r + 1) * (r + 1) > 0) {
            r++;
        }
        while (r * r > x || r * r < 0) {
            r--;
        }
        return r;
    }

    static long icbrt(long x) {
        if (x == 0)
            return 0;
        long r = (long) Math.cbrt((double) x);
        while (Math.pow(r + 1, 3) <= x) {
            r++;
        }
        while (r * r * r > x || r * r * r < 0) {
            r--;
        }
        return r;
    }

    static long helper(long L) {
        if (L == 0)
            return 0;
        long res = 0;
        long m0 = (long) (0.5 + Math.sqrt(0.25 + (double) (L - 1) / 2.0));
        long K = m0 / 2;
        res += K * K;

        long m = 2 * K + 1;
        long n = isqrt(L > m * m ? L - m * m : 0);
        while (true) {
            long z = L > m * m ? L - m * m : 0;
            if (z == 0)
                break;
            while (n * n > z)
                n--;
            res += n / 2;
            m++;

            z = L > m * m ? L - m * m : 0;
            if (z == 0)
                break;
            while (n * n > z)
                n--;
            res += (n + 1) / 2;
            m++;
        }
        return res;
    }

    public static String solve() {
        long N = 3141592653589793L;
        long L = icbrt(N);

        long[] v = new long[(int) L + 1];
        long[] bigV = new long[(int) (L / 2) + 1];

        for (long x = 1; x <= L; x++) {
            long res = helper(x);
            long c = icbrt(x);

            for (long g = 3; g <= c; g += 2) {
                res -= v[(int) (x / (g * g))];
            }

            long prev_y = (isqrt(x) - 1) / 2;
            long z_end = c + ((x / (c * c) != c) ? 1 : 0);

            for (long z = 1; z < z_end; z++) {
                long y = (isqrt(x / (z + 1)) - 1) / 2;
                res -= (prev_y - y) * v[(int) z];
                prev_y = y;
            }
            v[(int) x] = res;
        }

        for (long a = (L - 1) / 2; a >= 0; a--) {
            long x = 2 * a + 1;
            long k = N / (x * x);
            long res = helper(k);
            long c = icbrt(k);

            for (long b = 1; b <= (c - 1) / 2; b++) {
                long g = 2 * b + 1;
                long k_gg = k / (g * g);
                if (k_gg <= L) {
                    res -= v[(int) k_gg];
                } else {
                    int idx = (int) (2 * a * b + a + b);
                    res -= bigV[idx];
                }
            }

            long prev_y = (isqrt(k) - 1) / 2;
            long z_end = c + ((k / (c * c) != c) ? 1 : 0);

            for (long z = 1; z < z_end; z++) {
                long y = (isqrt(k / (z + 1)) - 1) / 2;
                res -= (prev_y - y) * v[(int) z];
                prev_y = y;
            }
            bigV[(int) a] = res;
        }

        return Long.toString(bigV[0]);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
