#include <stdio.h>
#include<iostream>
#include <string>
#include <string.h>
#include <vector>
#include <cmath>
#include <algorithm>
#include <queue>
#include <climits>
#include <set>
#include <unordered_map>
#include <map>
#include <stack>
#include <unordered_set>
#define hash hassh
using namespace std;
long double ansk[200005],ansb[200005];
int f[200005];
int main() {
    int n,m,k,t;
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++) scanf("%d",&t),f[t]=1;
    long double sum=0;
    long double cnt=0;
    for(int i=n-1;i>=0;i--){
        //cout<<cnt<<" "<<sum<<endl;
        if(f[i]) ansk[i]=(long double)1.0000000,ansb[i]=0;
        else {
            ansk[i] = cnt / m;
            ansb[i] = sum / m + (long double)1.000000;
        }
        sum+=ansb[i];
        cnt+=ansk[i];
        sum-=ansb[i+m];
        cnt-=ansk[i+m];
        if(fabs(ansk[i]-1.00000000)<1e-9&&!f[i]){
            puts("-1");
            return 0;
        }
    }
    printf("%.6Lf\n",ansb[0]/((long double)1.00000-ansk[0]));
    return 0;
}

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;

typedef long long ll;

int main() {
    ll N, M, K, A;
    cin >> N >> M >> K;
    vector<bool> start(N + 1, false);
    rep(i, K) {
        cin >> A;
        start[A] = true;
    }
    double L = 0, R = 1e20;
    vector<double> dp(N + 1 + M, 0);
    rep(i, 100) {
        double m = (L + R) / 2, s = 0;
        rep(j, N) {
            if (start[N - 1 - j]) {
                dp[N - 1 - j] = m;
            } else {
                dp[N - 1 - j] = 1 + s / M;
            }
            s += dp[N - 1 - j];
            if (j >= M - 1) s -= dp[N - 1 - j + M];
            //cout << "s=" << s << " ";
        }
        if (dp[0] > m) L = m;
        else R = m;
        //rep(i, N + 1) cout << dp[i] << " "; cout << "\n";
        //cout << L << " " << R << "\n";
    }
    if (dp[0] > 1e15) cout << "-1\n";
    else cout << fixed << setprecision(20) << dp[0] << "\n";
}