import java.util.ArrayDeque;
import java.util.Deque;

public class Euler485 {

    private static short[] divisorCounts(int u) {
        short[] d = new short[u + 1];
        int[] lp = new int[u + 1];
        byte[] exp = new byte[u + 1];
        int[] primes = new int[u / 5];
        int primeCount = 0;

        d[1] = 1;
        for (int i = 2; i <= u; ++i) {
            int minp = lp[i];
            if (minp == 0) {
                primes[primeCount++] = i;
                d[i] = 2;
                exp[i] = 1;
                minp = i;
            }

            for (int j = 0; j < primeCount; ++j) {
                int p = primes[j];
                if (p > minp)
                    break;
                long x64 = (long) i * p;
                if (x64 > u)
                    break;
                int x = (int) x64;

                lp[x] = p;
                if (p == minp) {
                    byte e = (byte) (exp[i] + 1);
                    exp[x] = e;
                    d[x] = (short) (d[i] / (exp[i] + 1) * (e + 1));
                    break;
                }

                exp[x] = 1;
                d[x] = (short) (d[i] * 2);
            }
        }
        return d;
    }

    private static long solve(int u, int k) {
        short[] d = divisorCounts(u);
        Deque<Integer> dq = new ArrayDeque<>();
        long sum = 0;

        for (int i = 1; i <= u; ++i) {
            while (!dq.isEmpty() && d[dq.peekLast()] <= d[i]) {
                dq.pollLast();
            }
            dq.addLast(i);
            while (!dq.isEmpty() && dq.peekFirst() <= i - k) {
                dq.pollFirst();
            }
            if (i >= k) {
                sum += d[dq.peekFirst()];
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        int u = 100_000_000;
        int k = 100_000;
        System.out.println(solve(u, k));
    }
}
