public class Euler202 {
    public static void main(String[] args) {
        long reflections = 12017639147L;
        long n = (reflections + 3) / 2;
        // Factor n
        java.util.List<Long> factors = new java.util.ArrayList<>();
        long tmp = n;
        for (long p = 2; p * p <= tmp; p++) {
            if (tmp % p == 0) {
                factors.add(p);
                while (tmp % p == 0)
                    tmp /= p;
            }
        }
        if (tmp > 1)
            factors.add(tmp);
        long[] f = factors.stream().mapToLong(Long::longValue).toArray();
        long[] ans = { 0 };
        dfs(f, 0, 1, 0, n, ans);
        System.out.println(ans[0]);
    }

    static void dfs(long[] factors, int idx, long prod, int parity, long n, long[] ans) {
        if (idx == factors.length) {
            long cnt = countMod2(n, prod);
            if (parity % 2 == 0)
                ans[0] += cnt;
            else
                ans[0] -= cnt;
            return;
        }
        dfs(factors, idx + 1, prod, parity, n, ans);
        long p = factors[idx];
        if (prod > (n - 1) / p)
            return;
        dfs(factors, idx + 1, prod * p, parity + 1, n, ans);
    }

    static long countMod2(long n, long d) {
        if (d % 3 == 0)
            return 0;
        long m = (n - 1) / d;
        int inv3 = (d % 3 == 1) ? 1 : 2;
        int res = (2 * inv3) % 3;
        long first = (res == 0) ? 3 : res;
        if (first > m)
            return 0;
        return 1 + (m - first) / 3;
    }
}
