#include <bits/stdc++.h>
using namespace std;
using Graph = vector<vector<long long>>;
const long long INF = 1LL <<59;
const long long Mo=1000000007;
     
vector<long long> seen;

long long dfs(const Graph &G, int v, long long cnt) {
  seen[v] = cnt;	//判定だけならcntをboolに
  // v から行ける各頂点 next_v について
  for (auto next_v : G[v]) {
    if (seen[next_v]>=0) continue; // next_v が探索済だったらスルー
    dfs(G, next_v, cnt); // 再帰的に探索
  }
  //cout<<grp<<" "<<cnt<<endl;
  return 0;
}
     
long long gcn(long long x,long long y){
  if(x%y==0){
    return y;  
  }
  else{
    return gcn(y,x%y);
  }
}
     
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1) res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}  
int main(void){
  long long tmp,idx,cur,prev;
  long long flg;
  long long i,j,l;
  long long n,m,k;
  long double res,tmp1,tmp2;
  
  cin>>n>>m>>k;
  long long a[k];
  long double dp[n+1][2]={};
  long double mm=1.0/(long double)m;
  //cout<<mm;
  
  for(i=0;i<k;i++){
    cin>>a[i];
  }
  sort(a,a+k);

  tmp=1;
  for(i=1;i<k;i++){
    if(a[i]-a[i-1]==1){
      tmp++;
      if(tmp==m){
        cout<<-1<<endl;
        return 0;
      }
    }
    else{
      tmp=1;
    }
  }


  tmp1=0;
  tmp2=0;

  for(i=n-1;i>=0;i--){
    flg=0;
    
    tmp1+=dp[i+1][0];
    tmp2+=dp[i+1][1];

    if(i+m+1<=n){
      tmp1-=dp[i+m+1][0];
      tmp2-=dp[i+m+1][1];
    }  

    for(j=0;j<k;j++){
      if(i==a[j]){
        flg=1;
        break;
      }
    }
    if(flg==1){
      dp[i][1]=1;
      continue;
    }
      
    dp[i][0]=tmp1/m+1.0;
    dp[i][1]=tmp2/m;
  }
  //cout<<dp[0][0]<<" "<<dp[1][0]<<" "<<dp[2][0]<<endl;  
  if(dp[0][1]==1){
    res=-1;
  }
  else{
    res=dp[0][0]/(1.0-dp[0][1]);
  }
  
  //cout<<res<<endl;
  cout<<setprecision(15)<<res<<endl;
  //cout<<res<<endl;
      
  return 0;
}

/*
Graph G(n);
seen.assign(n,-1);
for(i=0; i<m; i++) {
  cin>>tmp1>>tmp2;
  tmp1--;
  tmp2--;
  G[tmp1].push_back(tmp2);
  G[tmp2].push_back(tmp1);
}
*/
#include <bits/stdc++.h>

#define LL long long

#define ull unsigned long long

#define F(i, j, k) for(int i = j; i <= k; i++)

#define DF(i, j, k) for(int i = j; i >= k; i--)

using namespace std;

template <typename T> inline void read(T &n) {
	T w = 1;
	n = 0;
	char ch = getchar();
	while (!isdigit(ch) && ch != EOF) {
		if (ch == '-') w = -1;
		ch = getchar();
	}
	while (isdigit(ch) && ch != EOF) {
		n = (n << 3) + (n << 1) + (ch & 15);
		ch = getchar();
	}
	n *= w;
}

template <typename T> inline void write(T x) {
	T l = 0;
	ull y = 0;
	if (!x) {
		putchar(48);
		return;
	}
	if (x<0) {
		putchar('-');
		x = -x;
	}
	while (x) {
		y = y * 10 + x % 10;
		x /= 10;
		l++;
	}
	while (l) {
		putchar(y % 10 + 48);
		y /= 10;
		l--;
	}
}

template <typename T> inline void writes(T x) {
	write(x);
	putchar(' ');
}

template <typename T> inline void writeln(T x) {
	write(x);
	puts("");
}

template <typename T> inline void checkmax(T &a,T b) { a = a > b ? a : b; }

template <typename T> inline void checkmin(T &a,T b) { a = a < b ? a : b; }

const int N = 2e5 + 10;

int p[N], wei[N];

struct wzy {
	long double x, c;
	wzy (long double X = 0,long double C = 0) {
		x = X;
		c = C;
	}
} f[N], g[N];

wzy operator +(const wzy x,const wzy y) { return wzy{x.x + y.x, x.c + y.c}; }

wzy operator -(const wzy x,const wzy y) { return wzy{x.x - y.x, x.c - y.c}; }

wzy operator *(const double x, const wzy y) { return wzy{x * y.x, x * y.c}; }

int main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	int n, k, m;
	read(n);
	read(m);
	read(k);
	F(i, 1, k)  { read(p[i]); wei[p[i]] = 1; }
	F(i, n, n + m - 1) f[i].x = 1;
	DF(i, n + m - 1, n) g[i] = g[i + 1] + f[i];
	long double changshu1 = m;
	long double changshu2 = 1 / changshu1;
	DF(i, n - 1, 0) {
		f[i] = changshu2 * (g[i + 1] - g[i + m + 1]);
		f[i].c -= 1.0;
		if (wei[i]) f[i].x = f[i].c = 0;
		g[i] = g[i + 1] + f[i];
	}
	if (f[0].x == 0) puts("-1");
	else cout << fixed << setprecision(4) << -f[0].c / f[0].x << endl;
	return 0;
}

