#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;

#define pii pair<double, double>
#define F first
#define S second

int main() {
    ios_base :: sync_with_stdio(0);
    cin.tie(0);
    
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> faltu(n+1);
    while (k --) {
        int x;
        cin >> x;
        faltu[x] ++;
    }
    
    vector<pii> suf(n+n+m, {0, 0});
    
    for (int j = n-1; j >= 0; j --) {
        if (faltu[j]) {
            suf[j] = suf[j+1];
            suf[j].F ++;
            
            continue;
        }
        double co = (suf[j+1].F - (j+m+1 <= n? suf[j+m+1].F : 0))/(double)m;
        double val = (suf[j+1].S - (j+m+1 <= n? suf[j+m+1].S : 0))/(double)m + 1;
        
        suf[j] = {suf[j+1].F+co, suf[j+1].S+val};
        
        // cout << j << " --> " << suf[j].F << " " << suf[j].S << endl;
    }
    double co = suf[0].F - suf[1].F;
    double val = suf[0].S - suf[1].S;
    if(co==1){
    	cout<<"-1";
      return 0;
    }
    double ans = ((double)val/((double)1 - co));
     cout << fixed << setprecision(3) << (ans) << '\n';
    return 0;
}
#include<bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
using namespace std;
// typedef tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
#define ll long long 
#define scn(n) scanf("%d",&n)
#define lscn(n) scanf("%lld",&n)
#define lpri(n) printf("%lld",n)
#define pri(n) printf("%d",n)
#define pln() printf("\n")
#define priln(n) printf("%d\n",n)
#define lpriln(n) printf("%lld\n",n)
#define rep(i,init,n) for(int i=init;i<n;i++)
#define pb push_back     
#define mp make_pair
#define F first
#define S second
#define gcd __gcd
#define inf INT_MAX
#define ninf INT_MIN   
#define inf INT_MAX
#define linf LLONG_MAX
#define lninf LLONG_MIN   
const int mod = 1e9 + 7;
const int N = 1e5 + 4;
typedef long double ld;

int solve()
{
	int n, m, k; scn(n); scn(m); scn(k);

	pair<ld, ld> p = {0.0, 0.0};

	vector<int> mark(n + 1, 0);

	rep(i, 0, k)
	{
		int val; scn(val);

		mark[val]++;
	}

	int cnt = 0;

	rep(i, 1, n)
	{
		if(mark[i])
		cnt++;
		else
		{
			if(cnt >= m)
			{
				pri(-1); return 0;
			}

			cnt = 0;
		}
	}	

	if(cnt >= m)
	{
		pri(-1); return 0;
	}
	
	vector<pair<ld, ld>> v(n + m + 1, {0.0, 0.0});

	for(int i = n - 1; i >= 0; i--)
	{
		p.F -= v[i + m + 1].F; p.S -= v[i + m + 1].S;

		if(mark[i])
		{
			v[i].F = 1.0; 
		}
		else
		{
			v[i].F = p.F / (ld)m; v[i].S = p.S / (ld)m;

			v[i].S += 1.0;
		}

		// cout << v[i].F << " " << v[i].S << endl;

		if(i == 0)
		cout << fixed << setprecision(10) << v[i].S / (1.0 - v[i].F);

		p.F += v[i].F; p.S += v[i].S; 
	}

	return 0;
}

int main()                  
{
	int t = 1; //scn(t);

	while(t--)
	{
		solve();
	}

    return 0;
}