#include <iostream>
#include <vector>
#include<iomanip>
#include<functional>
#include<algorithm>
#include<deque>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define rep(i,n) for(int i = 0;i<n;i++)
#define req(i,n) for(int i = 1;i<=n;i++)
#define rrep(i,n) for(int i = n-1;i>=0;i--)
#define ALL(a) a.begin(),a.end()
typedef long long ll;
typedef double d;
typedef pair<int, int> P;
const int inf = 1 << 30;
struct liner {
	d a, b;
	liner(d a = 0, d b = 0): a(a), b(b) {}
	liner operator+(const liner& x)const {
		return liner(a + x.a, b + x.b);
	}liner operator-(const liner& x)const {
		return liner(a - x.a, b - x.b);
	}liner operator/(int x)const {
		return liner(a / x, b / x);
	}
};
int main() {
	int n, m, k,p,sum=0; cin >> n >> m >> k;
	vector<bool> f(n + 1, 0);
	rep(i, k) {
		cin >> p; f[p] = 1;
	}rep(i, n + 1) {
		if (f[i])sum++;
		else sum = 0;
		if (sum >= m) {
			cout << -1 << endl;
			return 0;
		}
	}vector<liner> dp(n + 1); liner S;
	rrep(i, n) {
		if (f[i]) dp[i] = liner(1, 0);
		else dp[i] = S / m + liner(0, 1);
		S = S+dp[i];
		if (i + m <= n) S = S - dp[i + m];
	}cout <<fixed<<setprecision(10) << dp[0].b / (1 - dp[0].a) << endl;
}

#pragma GCC optimize("Ofast")

#include <bits/stdc++.h>

#define u64 long long
#define rint register int
#define co(x) cout << (x) << endl
#define cosp(x) cout << (x) << ' '
#define ce(x) cerr << (x) << endl
#define cesp(x) cerr << (x) << ' '

using namespace std;

//#define getchar() (p_1==p_2&&(p_2=(p_1=buf)+fread(buf,1,1<<21,stdin),p_1==p_2)?EOF:*p_1++)

namespace Fast_Sec
{
	namespace Calculation
	{
		inline u64 max_(u64 a, u64 b) { return a > b ? a : b; }

		inline u64 min_(u64 a, u64 b) { return a < b ? a : b; }

		inline void swap_(int& a, int& b) {	a ^= b; b ^= a; a ^= b; }

		inline void swap_(u64& a, u64& b) {	a ^= b; b ^= a; a ^= b; }

		inline u64 abs_(u64 a) { return a < 0 ? -a : a; }
	};

	namespace IO
	{
		char buf[1<<23],*p_1=buf,*p_2=buf,obuf[1<<23],*O_=obuf;

		struct Fread{ } fin, fout; int f_; char ch_, Endl = '\n';

		inline Fread& operator >>(Fread& F, int &a)
		{
			f_ = 1; a = 0; ch_ = getchar();
			while (ch_ < '0' || ch_ > '9')
			{
				if (ch_ == '-') f_ = -1;
				ch_ = getchar();
			}
			while (ch_ >= '0' && ch_ <= '9')
			{
				a = (a << 3) + (a << 1) + (ch_ ^ 48);
				ch_ = getchar();
			}
			a *= f_; return F;
		}

		inline Fread& operator >>(Fread& F, u64 &a)
		{
			f_ = 1; a = 0; ch_ = getchar();
			while (ch_ < '0' || ch_ > '9')
			{
				if (ch_ == '-') f_ = -1;
				ch_ = getchar();
			}
			while (ch_ >= '0' && ch_ <= '9')
			{
				a = (a << 3) + (a << 1) + (ch_ ^ 48);
				ch_ = getchar();
			}
			a *= f_; return F;
		}

		Fread& operator <<(Fread& F, const int& a)
		{
			if (a < 0) { *O_++ = '-'; return F << -a; }
			if (a > 9) F << (a / 10); *O_++ = a % 10 + '0'; return F;
		}

		Fread& operator <<(Fread& F, const u64& a)
		{
			if (a < 0) { *O_++ = '-'; return F << -a; }
			if (a > 9) F << (a / 10); *O_++ = a % 10 + '0'; return F;
		}

		Fread& operator <<(Fread& F, const char& c) { *O_++ = c; return F; }
	};

	namespace Random
	{
		unsigned int _sd_ = 233;

		inline unsigned int rd()
		{
			return _sd_ ^= _sd_ >> 13, _sd_ ^= _sd_ << 17, _sd_ ^= _sd_ >> 5;
		}
	};
};
using namespace Fast_Sec::IO;
using namespace Fast_Sec::Random;
using namespace Fast_Sec::Calculation;

int n, a, x; string s;

int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
	fin >> n >> x; cin >> s;
	for (int i = 0; i < s.length(); i++)
	{
		if (s[i] == 'o') x++;
		else if (x > 0) x--;
		}	
		fout << x;
	fwrite(obuf, O_ - obuf, 1, stdout);
	return 0;
}



