#include<bits/stdc++.h>

using namespace std;

using ll = long long;

/*-----for personal-----*/
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define repn(i,n)  rep(i,0,n)
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

/*-----for lib-----*/
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) std::begin(x), std::end(x)

const long double EPS = 1e-12;
const int MOD = 1e9+7;
const int INF = INT_MAX / 2;
const ll LLINF = LLONG_MAX / 2;
//for(auto &h : H){ cout << h << " ";} cout << endl;
//for(auto &h : H){for(auto &k:h){cout << k << " ";}cout << endl;}
//for(auto [k,v] : mp){cout << k << " " << v << endl;}
//for(auto [k,v] : mp){cout << k << " "; for(auto &u:v){cout << u << " ";}cout << endl;}

/*
f(n) = (f(n+1)+1) * 1/M + (f(n+2)+1) * 1/M + .... + (f(n+M)+1) * 1/M
     = 1/M (f(n+1)+1+f(n+2)+1+f(n+3)+1+f(n+M)+1)
     = 1/M (f(n+1)+f(n+2)+...+f(n+M)+M)
     = 1/M (f(n+1)+f(n+2)+...+f(n+M)) + 1
f(n) = f(0) [循環する]

g(n) = 1/M (g(n+1)+g(n+2)+....+g(n+M)) + 1 振り出しじゃない
g(n) = X 振り出し


g(0) = 1/M (g(1)+g(2)+....+g(M)) + 1

f(0) - f(0)A = B
(1-A)f(0) = B

Mf(0) = MB/(M-MA)
A = 1/M*(1~Nでgが振り出しの数)
B = 1/M+(1~Mでgが振り出しでない数)+1
MA = (1~Nでgが振り出しの数)
MB = (1~Mでgが振り出しでない数)+M
*/

const int N = 100000;
const int M = 100000;
vector<bool> A(N+1,false);
vector<long double> dp(N+M, 0);
vector<long double> S(N+M, 0);
int n, m, k;

long double f(long double v){
  for(int i = n-1; i>=0; i--){
    if(A[i]){
      dp[i] = v;
    }else{
      dp[i] = 1+(S[i+1]-S[i+1+m])/m;
    }
    S[i] = dp[i] + S[i+1];
  }
  return dp[0];
}


int main(){
  cin >> n >> m >> k;
  repn(i,k){
    int a; cin >> a;
    A[a] = true;
  }

  int count = 0;
  for(int i = 0; i <= n; i++){
    if(!A[i]){count=0; continue;}
    count++;
    if(count>=m){ cout << -1 << endl; return 0;}
  }

  long double l=0, r=1e12, mid;
  //mid -> v
  count = 0;
	while(count<=100) {
		mid=(l+r)/2;
		if(abs(f(mid)-mid)<EPS) break;
    else if(f(mid)>mid) l=mid;
		else r=mid;
    count++;
	}

  cout << setprecision(12) << mid << endl;

}

//............Created by:- Arth Raj...........................//
#include <string.h>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <stack>
#include <queue>
#include <algorithm>
#include <numeric>
#include <sstream>
#include <climits>
#include <iomanip>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include<sstream>
#define ll long long int
#define pll pair<long long int,long long int>
#define pb push_back
#define mp make_pair
#define vi vector<long long int>
#define vii vector<pair<long long int,long long int>>
#define tez ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define lp(i,a,b) for(long long int i=a;i<b;i++)
#define rlp(i,a,b) for(long long int i=b;i>=a;i--)
#define ld long double
#define tl tuple<ll,ll,ll>
#define all(x) (x).begin(),(x).end()
#define bs(x,b) binary_search(all(x),b)
#define vip vector<pair<long long int,pair<long long int,long long int>>>
#define pip pair<long long int,pair<long long int,long long int>>
#define INF 1e18
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
ll abm(ll a, ll b, ll m) {ll ans = 1; a = a % m; while (b > 0) {if (b & 1)ans = (ans * a) % m; a = (a * a) % m; b = b / 2;} return ans % m;}
ll ncr(ll n, ll r, ll m) {if (r == 0)return 1; ll fac[n + 5]; fac[0] = 1; lp(i, 1, n + 1) {fac[i] = fac[i - 1] * i % m;} return (((fac[n] * abm(fac[r], m - 2, m)) % m) * (abm(fac[n - r], m - 2, m))) % m;}
int main()
{
	ll a, b, k;
	cin >> a >> b >> k;
	ll dp[70][70];
	lp(i, 0, 70)
	{
		dp[i][0] = 1;
	}
	lp(i, 1, 70)
	{
		lp(j, 1, i + 1)
		{
			dp[i][j] = i * dp[i - 1][j - 1];
			dp[i][j] /= j;
		}
	}
	char ans[a + b];
	ll pointer = 0;
	ll lefta = a, leftb = b;
	ll totalper = dp[a + b][a];
	while (pointer < (a + b))
	{
		ll x = dp[lefta + leftb - 1][leftb];
		// cout << x << endl;
		if (k > x)
		{
			// cout << "awd" << endl;
			ans[pointer++] = 'b';
			k -= x;
			leftb--;
		}
		else
		{
			ans[pointer++] = 'a';
			lefta--;
		}
		// cout << k << endl;
		if (k <= 1)
			break;
	}
	lp(i, pointer, a + b)
	{
		if (lefta)
		{
			ans[i] = 'a';
			lefta--;
		}
		else
		{
			ans[i] = 'b';
			leftb--;
		}
	}
	lp(i, 0, a + b)
	{
		cout << ans[i];
	}
	cout << endl;
}