#include <cmath>
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
long long S = 1;
void dfs(int i ,vector<int> arr[] , vector<bool>& v){
    v[i] = true;
    long long a = 3;
    if(arr[i].size()> 2)
        S = 0;
    for(int k = 0; k < arr[i].size() ; k++){
        if(!v[arr[i][k]])
            a--;
    }
    if(a < 0)
        S = 0 ;
    S *= a;
    for(int k = 0; k < arr[i].size() ; k++){
        if(!v[arr[i][k]])
           dfs(arr[i][k],arr,v);
    }
}
int main() {
    int n ,m ,k;
    cin>>n>>m;
    map<int,int> mp;
    for(int i =  0; i < n ; i++){
        cin>>k;
        mp[k]++;
    }
    for(int i = 0; i < m ; i++){
        cin>>k;
        mp[k]++;
    }
    for(auto [x,y] : mp){
        if(y == 1)
        cout<<x<<" ";
    }
}
#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;
}