import java.util.ArrayList;
import java.util.List;

public class Euler515 {

    static class GCDResult {
        long x, y, g;

        GCDResult(long x, long y, long g) {
            this.x = x;
            this.y = y;
            this.g = g;
        }
    }

    static GCDResult extendedGcd(long a, long b) {
        if (b == 0) {
            return new GCDResult(1, 0, a);
        }
        GCDResult res = extendedGcd(b, a % b);
        long x = res.y;
        long y = res.x - (a / b) * res.y;
        return new GCDResult(x, y, res.g);
    }

    static long modInverse(long a, long mod) {
        a %= mod;
        if (a == 0)
            return 0;
        GCDResult res = extendedGcd(a, mod);
        if (res.g != 1)
            return 0;
        long inv = res.x % mod;
        if (inv < 0)
            inv += mod;
        return inv;
    }

    static List<Integer> smallPrimesUpTo(int n) {
        boolean[] isPrime = new boolean[n + 1];
        for (int i = 2; i <= n; i++)
            isPrime[i] = true;
        for (int p = 2; p * p <= n; p++) {
            if (isPrime[p]) {
                for (int m = p * p; m <= n; m += p) {
                    isPrime[m] = false;
                }
            }
        }
        List<Integer> primes = new ArrayList<>();
        for (int i = 2; i <= n; i++) {
            if (isPrime[i])
                primes.add(i);
        }
        return primes;
    }

    static List<Long> segmentedPrimes(long low, long highExclusive) {
        if (highExclusive <= low)
            return new ArrayList<>();
        long highInclusive = highExclusive - 1;
        int root = (int) Math.sqrt(highInclusive);

        List<Integer> basePrimes = smallPrimesUpTo(root);
        int size = (int) (highExclusive - low);
        boolean[] isPrime = new boolean[size];
        for (int i = 0; i < size; i++)
            isPrime[i] = true;

        for (int p : basePrimes) {
            long start = (low + p - 1) / p * p;
            if (start < (long) p * p)
                start = (long) p * p;
            for (long x = start; x < highExclusive; x += p) {
                isPrime[(int) (x - low)] = false;
            }
        }

        if (low == 0) {
            isPrime[0] = false;
            if (size > 1)
                isPrime[1] = false;
        } else if (low == 1) {
            isPrime[0] = false;
        }

        List<Long> primes = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            if (isPrime[i])
                primes.add(low + i);
        }
        return primes;
    }

    static long D(long a, long b, long k) {
        long m = k - 1;
        List<Long> primes = segmentedPrimes(a, a + b);
        long total = 0;
        for (long p : primes) {
            total += modInverse(m, p);
        }
        return total;
    }

    public static void main(String[] args) {
        long a = 1000000000L;
        long b = 100000L;
        long k = 100000L;
        System.out.println(D(a, b, k));
    }
}
