#include <bits/stdc++.h>
using namespace std;
template <class T>
T inf() {
  return (numeric_limits<T>::max() >> 1);
}
FILE *file_in = stdin, *file_out = stdout;
struct NORMAL_IN {
  bool cnt;
  NORMAL_IN() : cnt(true) {}
  operator int() const { return cnt; }
  NORMAL_IN &operator>>(int &n) {
    cnt = fscanf(file_in, "%d", &n) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(unsigned int &n) {
    cnt = fscanf(file_in, "%u", &n) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(long long &n) {
    cnt = fscanf(file_in, "%lld", &n) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(unsigned long long &n) {
    cnt = fscanf(file_in, "%llu", &n) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(double &n) {
    cnt = fscanf(file_in, "%lf", &n) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(long double &n) {
    cnt = fscanf(file_in, "%Lf", &n) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(char *c) {
    cnt = fscanf(file_in, "%s", c) != EOF;
    return *this;
  }
  NORMAL_IN &operator>>(string &s) {
    s.clear();
    for (bool r = false;;) {
      const char c = getchar();
      if (c == EOF) {
        cnt = false;
        break;
      }
      const int t = isspace(c);
      if (!r and !t) r = true;
      if (r) {
        if (!t)
          s.push_back(c);
        else
          break;
      }
    }
    return *this;
  }
  template <class T>
  NORMAL_IN &operator>>(vector<T> &v) {
    int n;
    fscanf(file_in, "%d", &n);
    for (int i = 0; i < (int)(n); ++i) {
      T t;
      *this >> t;
      v.push_back(t);
    }
  }
} normal_in;
struct NORMAL_OUT {
  NORMAL_OUT &operator<<(const int &n) {
    fprintf(file_out, "%d", n);
    return *this;
  }
  NORMAL_OUT &operator<<(const unsigned int &n) {
    fprintf(file_out, "%u", n);
    return *this;
  }
  NORMAL_OUT &operator<<(const long long &n) {
    fprintf(file_out, "%lld", n);
    return *this;
  }
  NORMAL_OUT &operator<<(const unsigned long long &n) {
    fprintf(file_out, "%llu", n);
    return *this;
  }
  NORMAL_OUT &operator<<(const double &n) {
    fprintf(file_out, "%lf", n);
    return *this;
  }
  NORMAL_OUT &operator<<(const long double &n) {
    fprintf(file_out, "%Lf", n);
    return *this;
  }
  NORMAL_OUT &operator<<(const char c[]) {
    fprintf(file_out, "%s", c);
    return *this;
  }
  NORMAL_OUT &operator<<(const string &s) {
    fprintf(file_out, "%s", s.c_str());
    return *this;
  }
} normal_out;
int main() {
  const int K = 100000, C = 26;
  vector<vector<pair<int, int> > > dp(27,
                                      vector<pair<int, int> >(K + 1, {0, 0}));
  dp[0][0] = {1, 0};
  unordered_set<int> next;
  next.insert(0);
  for (int i = 0; i < C; i++) {
    unordered_set<int> nnext;
    dp[i + 1] = dp[i];
    for (const auto &j : next) {
      int s = 0;
      for (int d = 1;; d++) {
        s += d;
        long long j2 = (long long)j + s;
        if (j2 > K) break;
        if (!dp[i + 1][j2].first) {
          dp[i + 1][j2] = {1, d};
          nnext.insert(j2);
        }
      }
    }
    next = nnext;
  }
  int k;
  normal_in >> k;
  if (k == 0) {
    normal_out << "a"
               << "\n";
    return 0;
  }
  int i = 0;
  while (!dp[i][k].first) i++;
  string s;
  while (i > 0) {
    long long j = dp[i][k].second;
    for (int t = 0; t < (int)(j + 1); ++t) s += 'a' + i;
    k -= j * (j + 1) / 2;
    i--;
  }
  normal_out << s << "\n";
  return 0;
}
