#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <numeric>
#include <bitset>
#include <cmath>

static const int MOD = 1000000007;
using ll = long long;
using u32 = unsigned;
using u64 = unsigned long long;
using namespace std;

template<class T> constexpr T INF = ::numeric_limits<T>::max() / 32 * 15 + 208;

int main() {
    ll a, b, k;
    cin >> a >> b >> k;
    const int maxn = 60;
    ll C[maxn + 1][maxn + 1];
    C[0][0] = 1;
    for (int n = 1; n <= maxn; ++n) {
        C[n][0] = C[n][n] = 1;
        for (int m = 1; m < n; ++m)
            C[n][m] = C[n - 1][m - 1] + C[n - 1][m];
    }
    k--;
    string ans;
    while(a || b){
        if(!b) {
            ans += 'a';
            a--;
        }else if(!a){
            ans += 'b';
            b--;
        }else if(k < C[a+b-1][b]){
            ans += 'a';
            a--;
        }else {
            ans += 'b';
            k -= C[a+b-1][b];
            b--;
        }
    }
    cout << ans << "\n";
    return 0;
}
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

void _cin(){} template <class Head, class... Tail> void _cin(Head&& head, Tail&&... tail){ cin >> head; _cin(forward<Tail>(tail)...); }
template<class T> void _cout(T &&x){ cout << x << "\n"; } template <class Head, class... Tail> void _cout(Head&& head, Tail&&... tail){ cout << head << " "; _cout(forward<Tail>(tail)...); }
template<typename S, typename T> ostream& operator<<(ostream &os, const pair<S, T> &p){ cout << "[" << p.first << ", " << p.second << "]"; return os; }

#define Sq(x) (x)*(x)
#define For(i, n) for(int i = 0; i < (n); i ++)
#define For1(i, n) for(int i = 1; i <= (n); i ++)
#define Rof(i, n) for(int i = (n)-1; i >= 0; i --)
#define Rep(n) For(_, n)
#define Range(c) c.begin(), c.end()
#define RevRange(c) c.rbegin(), c.rend()
#define Contains(c, x) (find(Range(c), x) != c.end())
#define Search(rb, re, x) distance(rb, find(rb, re, x))
#define Sort(a) sort(Range(a))
#define DeSort(a) sort(RevRange(a))
#define Reverse(c) reverse(Range(c))
#define Unique(a) a.erase(unique(Range(a)), a.end())
#define Cusum(T, xs, sxs) vector<T> sxs(xs.size()+1); For(i, (int)xs.size()) sxs[i+1] = sxs[i] + xs[i]
#define Cin(T, ...) T __VA_ARGS__; _cin(__VA_ARGS__)
#define Cins(T, n, xs) vector<T> xs(n); For(i, n) cin >> xs[i]
#define Cins2(T, n, xs, ys) vector<T> xs(n), ys(n); For(i, n) cin >> xs[i] >> ys[i]
#define Cins3(T, n, xs, ys, zs) vector<T> xs(n), ys(n), zs(n); For(i, n) cin >> xs[i] >> ys[i] >> zs[i]
#define Cinss(T, m, n, xs) vector<vector<T>> xs(m, vector<T>(n)); For(i, m) For(j, n) cin >> xs[i][j]
#define Cinm(T, n, map) unordered_map<T, int> map; Rep(n){ Cin(T, x); map[x] ++; }
#define Cout(...) _cout(__VA_ARGS__)
#define Couts(xs) { for(const auto &e : xs) cout << e << " "; cout << "\n"; }
#define Coutss(xs) { For(i, xs.size()) Couts(xs[i]); }
#define Coutyn(cond) Cout((cond) ? "yes" : "no")
#define CoutYn(cond) Cout((cond) ? "Yes" : "No")
#define CoutYN(cond) Cout((cond) ? "YES" : "NO")
#define Return(expr) { Cout(expr); return 0; }
#define vc vector
#define Vc2(T, m, n, xs) vc<vc<T>> xs(m, vc<T>(n))
#define Mini(a, x) a = min(a, x)
#define Maxi(a, x) a = max(a, x)

// constexpr int MOD = 1e9+7;
// constexpr long double tau = 6.28318530717958647692;


int main(void){
    Cin(int, a, b);
    int n = a+b;
    Vc2(ll, n+1, n+1, c);
    c[0][0] = 1;
    For1(i, n) For1(j, n) c[i][j] = c[i-1][j-1] + c[i-1][j];

    Cin(ll, k);
    string ans = "";
    ll skipped = 0;
    Rep(n){
        if(skipped + c[a+b][a] < k){
            skipped += c[a+b][a];
            ans += 'b';
            b --;
        }
        else{
            ans += 'a';
            a --;
        }
    }
    Cout(ans);
}