#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define fi first
#define se second
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const int INF = (1<<30) - 1;
const ll LINF = (1LL<<62) - 1;

template <typename Monoid>
struct SegTree {
    using F = function<Monoid(Monoid, Monoid)>;
    const F f;
    const Monoid unit;

    int n;
    vector<Monoid> dat;

    SegTree(int n_, const F f_, const Monoid unit_) : f(f_), unit(unit_) {
        n = 1;
        while (n < n_) n *= 2;
        // 1-indexed
        dat.assign(2 * n, unit);
    }

    void set(int i, const Monoid &x) {
        dat[i + n] = x;
    }
    void build() {
        for (int i = n - 1; i >= 0; --i) {
            dat[i] = f(dat[2 * i], dat[2 * i + 1]);
        }
    }

    void update(int i, const Monoid &x){
        i += n;
        dat[i] = x;
        while (i >>= 1){
            dat[i] = f(dat[2 * i], dat[2 * i + 1]);
        }
    }

    // [a, b) 非再帰
    Monoid query(int a, int b) {
        Monoid l = unit, r = unit;
        for (a += n, b += n; a < b; a >>= 1, b >>= 1) {
            if (a & 1) l = f(l, dat[a++]);
            if (b & 1) r = f(dat[--b], r);
        }
        return f(l, r);
    }

    inline Monoid operator[] (int i){
        return dat[i + n];
    }
};
// set(i, v)した後にbuild()でO(n)
// 区間和 : SegTree<int> seg(n, [](int a, int b){ return a + b; }, 0);
// 区間min : SegTree<int> seg(n, [](int a, int b) {return min(a, b); }, INF);


int main(){
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> a(k);
    int modoru[100010] = {};
    for (int i = 0; i < k; ++i) {
        cin >> a[i];
        modoru[a[i]] = 1;
    }

    int cnt = 0;
    for (int i = 0; i <= n; ++i) {
        if (modoru[i]) cnt++;
        else cnt = 0;
        if (cnt >= m) {
            cout << -1 << endl;
            return 0;
        }
    }

    SegTree<double> seg(n + m + 10, [](double a, double b){ return a + b; }, 0);
    SegTree<double> seg2(n + m + 10, [](double a, double b){ return a + b; }, 0);
    for (int i = n-1; i >= 0; --i) {
        double a = seg.query(i + 1, i + m + 1) / m + 1.0;
        double b = seg2.query(i + 1, i + m + 1) / m;

        if (modoru[i]) {
            seg2.update(i, 1.0);
        } else {
            seg.update(i, a);
            seg2.update(i, b);
        }
    }

    // x = seg[0] + seg2[0] * x
    cout << fixed << setprecision(15) << seg[0] / (1 - seg2[0]) << endl;
}
//#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define DEBUG
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define PI 3.14159265358979323846
#define Base 23333333
//#define set unordered_set
//#define map unordered_map
#define int long long
#define LL long long
#define NO	cout<<"NO"<<endl
#define YES cout<<"YES"<<endl
#define No cout<<"No"<<endl
#define Yes cout<<"Yes"<<endl
#define mst(x) memset(x,0,sizeof(x))
#define debug(x) cout<<"DEBUG "<<#x<<" : "<<x<<endl

#define _up(x) ceil(x)
#define _down(x) floor(x)

#define range(x,y) 1

//#define int unsigned long long
using namespace std;
//#define scanf scanf_s
//#define max(a,b) ((a) > (b) ? (a) : (b))
//#define min(a,b) ((a) < (b) ? (a) : (b))
inline int gcd(int a, int b) { return b > 0 ? gcd(b, a%b) : a; }
inline int lcm(int a, int b) { return a * b / gcd(a, b); }
inline int qpow(int a, int n) { int ans = 1;	while (n) { if (n & 1) { ans *= a; }a *= a; n >>= 1; }return ans; }
inline int _qpow(int a, int n) { int ans = 1; while (n) { if (n & 1) { ans *= a % mod;	ans %= mod; }a *= a; a %= mod; n >>= 1; }return ans % mod; }

/*
#define read() _read()
#define cout fout
#define cin fin
ifstream fin("in.txt");fstream fout("out.txt");
int _read() {	int tmp;	fin >> tmp;	return tmp;}
*/
inline int read() { int x = 0, f = 1;	char ch = getchar();	while (ch<'0' || ch>'9') { if (ch == '-') { f = -1; }		ch = getchar(); }	while (ch >= '0'&&ch <= '9') { x = 10 * x + ch - '0';		ch = getchar(); }	return x * f; }

signed main()
{
	int v = read(), t = read(), s = read(), d = read();
	int st = v * t, ed = v * s;
	if (d > ed || d < st)Yes;
	else No;
	return 0;
}





