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

// 解法1 1次式を持つDP の実装
int main() {
	int n, m, k;
	cin >> n >> m >> k;
	vector<bool> ng(n, false);
	for (int i = 0; i < k; i++) {
		int a;
		cin >> a;
		ng[a] = true;
	}
	vector<vector<double>> g(n + m, vector<double>(2, 0.0));
	vector<double> sum(2, 0.0);
	for (int i = n - 1; i >= 0; i--) {
		if (ng[i]) {
			g[i][0] = 1.0;
			g[i][1] = 0.0;
		} else {
			g[i][0] = sum[0] / m;
			g[i][1] = sum[1] / m + 1.0;
		}
		sum[0] -= g[i + m][0] - g[i][0];
		sum[1] -= g[i + m][1] - g[i][1];
	}
	if (abs(g[0][0] - 1.0) < 0.00000000001) {
		cout << -1 << endl;
	} else {
		cout << fixed << (g[0][1] / (1.0 - g[0][0])) << endl;
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
int n, m, k, a, cnt;
bool f[100005];
complex<double> p[100005];
int main(){
	scanf("%d%d%d", &n, &m, &k);
	rep(i,k){
		scanf("%d", &a);
		f[a] = true;
	}
	for(int i=n-1; i>=0; i--){
		if(f[i]){
			cnt++;
			if(cnt >= m) return 0 * puts("-1");
			p[i] = 1;
		}else{
			p[i] = p[i+1+cnt] * (double)(m+1) + (double)cnt;
			for(int j=i+m+1; j <= i+m+1+cnt && j < n; j++) p[i] -= p[j];
			p[i] /= m;
			if(i+1+cnt == n) p[i] += 1i;
			cnt = 0;
		}
	}
	printf("%f\n", p[0].imag() / (1 - p[0].real()));
}