import java.util.Arrays;

public class Euler310 {
    static int[] buildGrundy(int limit) {
        int[] g = new int[limit + 1];
        int[] seen = new int[512];
        Arrays.fill(seen, -1);

        for (int n = 1; n <= limit; ++n) {
            for (int k = 1; k * k <= n; ++k) {
                int val = g[n - k * k];
                if (val >= seen.length) {
                    int[] newSeen = new int[val + 64];
                    System.arraycopy(seen, 0, newSeen, 0, seen.length);
                    Arrays.fill(newSeen, seen.length, newSeen.length, -1);
                    seen = newSeen;
                }
                seen[val] = n;
            }
            while (seen[g[n]] == n) {
                ++g[n];
            }
        }
        return g;
    }

    public static String solve() {
        int limit = 100000;
        int[] g = buildGrundy(limit);
        int maxG = 0;
        for (int x : g) {
            if (x > maxG) {
                maxG = x;
            }
        }

        long[] prefix = new long[maxG + 1];
        long[] suffix = new long[maxG + 1];

        for (int n = 0; n <= limit; ++n) {
            ++suffix[g[n]];
        }

        long answer = 0;
        for (int b = 0; b <= limit; ++b) {
            int gb = g[b];
            ++prefix[gb];

            for (int ga = 0; ga <= maxG; ++ga) {
                int gc = ga ^ gb;
                if (gc > maxG) {
                    continue;
                }
                answer += prefix[ga] * suffix[gc];
            }

            --suffix[gb];
        }

        return String.valueOf(answer);
    }

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