#include <bits/stdc++.h>
#define FOR(i, begin, end) for(int i=(begin);i<(end);i++)
#define IFOR(i, begin, end) for(int i=(end)-1;i>=(begin);i--)
#define rep(i, n) FOR(i,0,n)
#define irep(i, n) IFOR(i,0,n)
#define all(v) begin(v), end(v)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using P = pair<int, int>;
using PLL = pair<ll, ll>;
using VI = vector<int>;
using VLL = vector<ll>;
using VB = vector<bool>;
using VP = vector<P>;
using Graph2 = vector<vector<int>>;
using PQ = priority_queue<int>;
template<typename T>istream& operator>>(istream&s,vector<T>&v){for(auto &i: v)s>>i;return s;}
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
bool second_compare(P a,P b){if(a.second!=b.second){return a.second<b.second;} else return true;}

ll ch(ll a, ll b) {
    ll ret = 1;
    FOR(i, 1, b+1) {
        ret *= a;
        ret /= i;
        a--;
    }
    return ret;
}

int main() {
    ll a, b, k;
    cin >> a >> b >> k;

    string ans;

    ll now = 0;
    int n = a+b;
    rep(i, n) {
        if (a == 0) {
            cout << ans;
            rep(i, b) cout << 'b'; cout << endl;
            return 0;
        }
        if (b == 0) {
            cout << ans;
            rep(i, a) cout << 'a'; cout << endl;
            return 0;
        }

        --a;
        ll c = ch(a+b, a);
        if (now + c >= k) {
            ans += 'a';
        }
        else {
            ans += 'b';
            ++a;
            --b;
            now += c;
        }
    }

    cout << ans << endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

#define lli long long int
#define REP(i,s,n) for(int i=s;i<n;i++)
#define NUM 2520
#define INF (1LL<<50)
#define DEBUG 0
#define mp(a,b) make_pair(a,b)
#define SORT(V) sort(V.begin(),V.end())
#define PI (3.141592653589794)
#define TO_STRING(VariableName) # VariableName
#define LOG(x) if(DEBUG)cout<<TO_STRING(x)<<"="<<x<<" "<<endl;
#define LOG2(x,y) if(DEBUG)cout<<TO_STRING(x)<<"="<<x<<" "<<TO_STRING(y)<<"="<<y<<endl;
#define LOG3(x,y,z) if(DEBUG)cout<<TO_STRING(x)<<"="<<x<<" "<<TO_STRING(y)<<"="<<y<<" "<<TO_STRING(z)<<"="<<z<<endl;
#define LOG4(w,x,y,z) if(DEBUG)cout<<TO_STRING(w)<<"="<<w<<" "<<TO_STRING(x)<<"="<<x<<" "<<TO_STRING(y)<<"="<<y<<" "<<TO_STRING(z)<<"="<<z<<endl;

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; }

lli C[80][80];

void func(long long A, long long B, long long K){

    string s;

    while(B!=0 && A!=0){
        lli lefSum = A+B;
        LOG4(A,B,K,s);
        lli border = C[lefSum-1][B];
        LOG2(K,border);
        if(border < K){
            s.push_back('b');
            B--;
            K-=border;
        }
        else{
            s.push_back('a');
            A--;
        }
    }
    while(B--)s.push_back('b');
    while(A--)s.push_back('a');
    cout<<s<<endl;
    

}

int main(){
    // cout << fixed << setprecision(5);

    long long A;
    scanf("%lld",&A);
    long long B;
    scanf("%lld",&B);
    long long K;
    scanf("%lld",&K);
    C[0][0]=1;
    C[1][0]=1;
    C[1][1]=1;
    REP(i,2,62){
        REP(j,0,i+1){
            if(j==0)C[i][j]=1;
            else{
                C[i][j] = C[i-1][j-1] + C[i-1][j];
            }
        }
    }
    func(A, B, K);
    
    
    return 0;
}
