public class Euler668 {

    static int getIdx(long val, long n, int r, int vCount) {
        if (val <= r) {
            return vCount - (int) val;
        }
        return (int) (n / val) - 1;
    }

    static long solveCase(long n) {
        int r = (int) Math.sqrt(n);
        long[] V = new long[2 * r + 2];
        int vCount = 0;

        for (int i = 1; i <= r; ++i) {
            V[vCount++] = n / i;
        }
        for (long i = V[vCount - 1] - 1; i > 0; --i) {
            V[vCount++] = i;
        }

        long[] S = new long[vCount];
        for (int i = 0; i < vCount; ++i) {
            S[i] = V[i] - 1;
        }

        for (long p = 2; p <= r; ++p) {
            int idxP = getIdx(p, n, r, vCount);
            int idxPminus1 = getIdx(p - 1, n, r, vCount);

            if (S[idxP] > S[idxPminus1]) {
                long sp = S[idxPminus1];
                long p2 = p * p;

                for (int i = 0; i < vCount; ++i) {
                    long v = V[i];
                    if (v < p2)
                        break;

                    long nextV = v / p;
                    int nextIdx = getIdx(nextV, n, r, vCount);
                    S[i] -= (S[nextIdx] - sp);
                }
            }
        }

        long nonSmooth = 0;
        for (int q = 1; q <= r; ++q) {
            long rightVal = n / q;
            long leftVal = q - 1;

            int rightIdx = getIdx(rightVal, n, r, vCount);
            long leftS = leftVal == 0 ? 0 : S[getIdx(leftVal, n, r, vCount)];

            nonSmooth += S[rightIdx] - leftS;
        }

        return n - nonSmooth;
    }

    public static String solve() {
        long ans = solveCase(10000000000L);
        return Long.toString(ans);
    }

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