public class Euler756 {
    static double expectedError(int n, int m, int[] phi) {
        if (m >= n) {
            return 0.0;
        }

        double p = (double) (n - m) / (double) n;
        double total = (double) phi[1] * p;

        for (int k = 1; k < n - m; ++k) {
            p *= (double) (n - k - m) / (double) (n - k);
            total += (double) phi[k + 1] * p;
        }

        return total;
    }

    static int[] totientsUpTo(int n) {
        int[] phi = new int[n + 1];
        for (int i = 0; i <= n; ++i) {
            phi[i] = i;
        }
        for (int p = 2; p <= n; ++p) {
            if (phi[p] != p) {
                continue;
            }
            for (int j = p; j <= n; j += p) {
                phi[j] -= phi[j] / p;
            }
        }
        return phi;
    }

    public static String solve() {
        int n = 12345678;
        int m = 12345;
        int[] phi = totientsUpTo(n);
        double answer = expectedError(n, m, phi);
        return String.format(java.util.Locale.US, "%.6f", answer);
    }

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