#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 35;

ll dp[N][N],a,b,k;

string dfs(ll a,ll b,ll k){
	if (a==0) return string(b,'b');
	if (b==0) return string(a,'a');
	if (dp[a-1][b]>=k){
		return "a"+dfs(a-1,b,k); 
	} else {
		return "b"+dfs(a,b-1,k-dp[a-1][b]);
	}
}

int main(){
	cin>>a>>b>>k;
	dp[0][0]=1;
	for (int i=0;i<=a;i++){
		for (int j=0;j<=b;j++){
			if (i>0) dp[i][j]+=dp[i-1][j];
			if (j>0) dp[i][j]+=dp[i][j-1];
		}
	}
	cout<<dfs(a,b,k);
	return 0;
}
#include<bits/stdc++.h>
//#include<atcoder/all>
//using namespace atcoder;
#define rep(i,n) for(ll i=0;i<(n);++i)
#define rep2(i,n) for(ll i=1;i<=(n);++i)
#define rep3(i,i0,n) for(ll i=i0;i<(n);++i)
#define rrep(i,n) for(ll i=((n)-1); i>=0; --i)
#define rrep2(i,n) for(ll i=(n); i>0; --i)
#define pb push_back
#define mod 1000000007
#define fi first
#define se second
#define len(x) ((ll)(x).size())
using namespace std;
using ll = long long;
using ld = long double;
using Pi = pair< ll, ll >;
using vl = vector<ll>;
using vc = vector<char>;
using vb = vector<bool>;
using vs = vector<string>;
using vp = vector<Pi>;
using vvc = vector<vector<char>>;
using vvl = vector<vector<ll>>;
using vvvl = vector<vector<vector<ll>>>;

const ll INF = 1LL << 60;
const ld PI = 3.1415926535897932385;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
ll gcd(ll a, ll b) {return b?gcd(b,a%b):a;}
ll lcm(ll a, ll b) {return a/gcd(a,b)*b;}
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define mp make_pair
void printb(ll N,ll d=16){
    rep(i,d){
        cout<<(N/(1<<(d-i-1)))%2;
    }
    cout<<endl;
    
}
void printv(vector<ll>a){
    rep(i,a.size()){
        if(i==a.size()-1){
            cout<<a[i]<<endl;
        }else{
            cout<<a[i]<<" ";
        }
    }
}
bool In_map(ll y,ll x,ll h,ll w){
    if(y<0 || x<0 || y>=h || x>=w){
        return 0;
    }else{
        return 1;
    }
}
bool compare(Pi a, Pi b) {
    if(a.first != b.first){
        return a.first < b.first;
        
    }else{
        return a.second < b.second;
    }
}


//const vector<ll> dx = {1, 0, -1, 0, 1, -1, 1, -1};
//const vector<ll> dy = {0, 1, 0, -1, 1, 1, -1, -1};
const vector<ll> dx{1,0,-1,0};
const vector<ll> dy{0,1,0,-1};
const int MAX_N = 62;         // n の最大値
vector<vector<long long>> com;  // 前計算の結果を保存
// 動的計画法で前処理
void init() {
    com.assign(MAX_N, vector<long long>(MAX_N));
    com[0][0] = 1;
    for (int i = 1; i < MAX_N; ++i) {
        com[i][0] = 1;
        for (int j = 1; j < MAX_N; j++) {
            com[i][j] = (com[i - 1][j - 1] + com[i - 1][j]);
        }
    }
}
// nCk を取得
long long nCk(int n, int k) {
    assert(!(n < k));
    assert(!(n < 0 || k < 0));
    return com[n][k];
}

int main() {
    init();
    ll A,B,K;
    cin>>A>>B>>K;
    
    string ans;
    K--;
    while(1){

        rep(i,A+1){

            //cout<<i<<" "<<K<<" "<<A<<endl;
            if(K>=com[B-1+i][i]){
                K-=com[B-1+i][i];
            }else{
                rep(j,A-i){
                    ans.pb('a');
                }
                ans.pb('b');
                A-=A-i;
                B--;
                //cout<<"b"<<endl;
                break;
            }
        }

        if( B==0)break;
    }

    rep(i,A){
        ans.pb('a');
    }


    cout<<ans<<endl;


    
    return 0;
    

}