#include<bits/stdc++.h>
using namespace std;

#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
#define all(x) x.begin(),x.end()
#define pb push_back
#define po pop_back
#define pi(i, v) v[i]=v.back(); v.pop_back()
#define li long long

#define INF INT_MAX
// #define TEST_CASES

const int mod = 1e9 + 7;

void IO () {
  #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
  #endif
}
vector<vector<li>> dp; 
li binomialCoeff(int n, int k)
{
    if(dp[n][k] != -1) return dp[n][k];
    if (k > n)
        return dp[n][k] = 0;
    if (k == 0 || k == n)
        return dp[n][k] = 1;
 
    return dp[n][k] = binomialCoeff(n - 1, k - 1)
           + binomialCoeff(n - 1, k);
}

void solve() {
  // write your code here
  for(auto &x: dp) x.clear();
  int a, b;
  li k;
  cin >> a >> b >> k;
  dp.resize(70, vector<li>(70, -1));
  --k;
  string answer;
  int iter = a + b;
  for(int i=0; i<iter; ++i) {
    li study;
    //cout << a << " " << b << endl;
    if(dp[a+b-1][a-1] == -1) study = binomialCoeff(a+b-1, a-1);
    else study = dp[a+b-1][a-1]; 
    //cout << study << "-" << k << endl;

    if(study > k) answer.push_back('a'), --a;
    else answer.push_back('b'), k -= study, --b; 
    if(k <= 0) {
      for(int i=0; i<a; ++i) answer.pb('a');
      for(int i=0; i<b; ++i) answer.pb('b');
      break;
    } 
    if(a == 0) {
      for(int i=0; i<b; ++i) answer.pb('b');
      break;
    }
    if(b == 0) {
      for(int i=0; i<a; ++i) answer.pb('a');
      break;
    }

  }

  /*for(int i=0; i<70; ++i) {
    for(auto x: dp[i]) cout << x << ",";
    cout << endl;
  }*/

  cout << answer << endl;

}

int main() {
  fast;
  IO();
  #ifdef TEST_CASES
  int T;
  cin >> T;
  while(T--)
  #endif
    solve();  
}

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define PI 3.1415926535897932384626
#define mod 1000000007
#define mod1 998244353
#define ms(arr, v) memset(arr, v, sizeof(arr))
#define fo1(i,a,b) for(int i=a;i<=b;i++)
#define deb(x) cout<<x<<"\n";
#define deB(x,y) cout<<x<<" "<<y<<"\n";
#define Deb(x,y,z) cout<<x<<" "<<y<<" "<<z<<"\n"
#define YES cout<<"YES\n";
#define Yes cout<<"Yes\n";
#define NO cout<<"NO\n";
#define No cout<<"No\n";
#define all(v) (v).begin(),(v).end()
#define mk(arr,n,type)  type *arr=new type[n];

/*-------------------------------------------------------------------------------------------*/
ll mod_add(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;}
ll mod_mul(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;}
ll mod_sub(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;}
/*--------------------------------------------------------------------------------------------*/

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

	//ncr->pascals traingle
	vector<vector<ll>> ncr(61, vector<ll>(61));
	ncr[0][0] = 1;
	for (ll n = 1; n < 61; n++) {
		ncr[n][0] = 1;
		for (ll r = 1; r < n; r++) {
			ncr[n][r] = ncr[n - 1][r - 1] + ncr[n - 1][r];
		}
		ncr[n][n] = 1;
	}

	ll a, b, k;
	cin >> a >> b >> k;

	ll n = (a + b);

	for (ll i = 0; i < n; i++) {

		//If we put a at that position
		//  Now we find that at the remaining positions how many ways by which we can fill
		ll x = ncr[a - 1 + b][b];
		if (x >= k) {
			cout << 'a';
			a--;
		} else {
			cout << 'b';
			b--;
			k -= x;
		}
	}

	return 0;
}