/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

#define double long double

using namespace std;

typedef long long ll;

const int N_MAX = 200005;

int n, m, k;

bool trap[N_MAX];

double dp[N_MAX];

double solve (double answer)
{
    dp[1] = answer;
    double sum = 0;
    for(int i = n; i >= 1; i--)
    {
        if(trap[i] == true)
            dp[i] = dp[1];
        else
            dp[i] = 1 + sum / m;
        sum += dp[i];
        if(i + m <= n)
            sum -= dp[i + m];
    }
    return dp[1];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> k;
    for(int i = 1; i <= k; i++)
    {
        int pos;
        cin >> pos;
        pos++;
        trap[pos] = true;
    }
    cout << fixed << setprecision(15);
    if(k == 0)
    {
        cout << solve(0) << "\n";
        return 0;
    }
    int lg = 0;
    for(int i = 1; i <= n; i++)
    {
        if(trap[i] == true)
            lg++;
        else
            lg = 0;
        if(lg >= m)
        {
            cout << "-1\n";
            return 0;
        }
    }
    double l = 1, r = 10000000000000000;
    int cnt = 2250;
    while(cnt--)
    {
        double mid = (l + r) / 2;
        if(solve(mid) < mid)
            r = mid;
        else
            l = mid;
    }
    cout << l << "\n";
    return 0;
}

/**
 * code generated by JHelper
 * More info: https://github.com/AlexeyDmitriev/JHelper
 * @author tatsumack
 */

#include <iostream>
#include <fstream>

#include <bits/stdc++.h>

#define int long long
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define FOR(i, a, b) for (int i = (a), i##_len = (b); i <= i##_len; ++i)
#define REV(i, a, b) for (int i = (a); i >= (b); --i)
#define CLR(a, b) memset((a), (b), sizeof(a))
#define DUMP(x) cout << #x << " = " << (x) << endl;
#define INF 1001001001001001001ll
#define fcout cout << fixed << setprecision(12)

using namespace std;

typedef pair<int, int> P;

class FSugoroku2 {
public:
    vector<int> furidashi;
    int N, M, K;

    double calc(double m) {
        vector<double> dp(N + M + 5);
        double sum = 0;
        for (int i = N - 1; i >= 0; i--) {
            if (furidashi[i] > 0) {
                dp[i] = m;
            } else {
                dp[i] = 1 + sum / M;
            }
            sum += dp[i];
            sum -= dp[i+M];
        }
        return dp[0];
    }

    void solve(std::istream& cin, std::ostream& cout) {
        cin >> N >> M >> K;
        furidashi.resize(N+1);
        bool ok = true;
        int cur = 0;
        int prev = -INF;
        REP(i, K) {
            int a;
            cin >> a;
            furidashi[a] = 1;
            if (a - prev == 1) {
                cur++;
            } else {
                cur = 1;
            }
            if (cur >= M) {
                ok = false;
            }
            prev = a;
        }
        if (!ok) {
            cout << -1 << endl;
            return;
        }
        double l = 0;
        double r = INF;
        REP(i, 300) {
            double m = (l + r) / 2;
            if (calc(m) > m) {
                l = m;
            } else {
                r = m;
            }
        }
        fcout << l << endl;
    }
};


signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    std::istream& in(std::cin);
    std::ostream& out(std::cout);

    FSugoroku2 solver;
    solver.solve(in, out);
    return 0;
}
