import java.util.*;

//update 2020/1/1 23:01

public class Main{

  static Scanner sc = new Scanner(System.in);
  static StringBuilder sb = new StringBuilder();

  public static void main(String[] args) {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  }

  static String AAA(int block){
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  }



  static int lcm(int a,int b){
    return a*b*gcd(a,b);
  }

  static int gcd(int a,int b){
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  }

  /*
    static String toSmall(String s){
      char c = s.charAt(0);
      //if(Character.isUpperCase(c)){
      if(c<=90){
        c += 32;
      }
      return String.valueOf(c);
    }
    static String toBig(String s){
      char c = s.charAt(0);
      //if(Character.isLowerCase(c)){
      if(c>=97){
        c -= 32;
      }
      return String.valueOf(c);
    }
  */

  static String toSmall(String s){
    return s.toLowerCase();
  }

  static String toBig(String s){
    return s.toUpperCase();
  }

  static String next(){
    return sc.next();
  }

  static int nextInt(){
    return Integer.parseInt(sc.next());
  }

  static long nextLong(){
    return Long.parseLong(sc.next());
  }

  static double nextDouble(){
    return Double.parseDouble(sc.next());
  }

  static String[] splitString(String s){
    return s.split("");
  }

  static char[] splitChar(String s){
    return s.toCharArray();
  }

  static int charToInt(char a){
    return a - 48;
  }

////////////////////////////////////////////
  public static int max(int[] a){
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
  public static long max(long[] a){
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
////////////////////////////////////////////

////////////////////////////////////////////
  public static int min(int[] a){
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
  public static long min(long[] a){
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
////////////////////////////////////////////

} import java.util.*; util.* java public class Main{

  static Scanner sc = new Scanner(System.in);
  static StringBuilder sb = new StringBuilder();

  public static void main(String[] args) {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  }

  static String AAA(int block){
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  }



  static int lcm(int a,int b){
    return a*b*gcd(a,b);
  }

  static int gcd(int a,int b){
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  }

  /*
    static String toSmall(String s){
      char c = s.charAt(0);
      //if(Character.isUpperCase(c)){
      if(c<=90){
        c += 32;
      }
      return String.valueOf(c);
    }
    static String toBig(String s){
      char c = s.charAt(0);
      //if(Character.isLowerCase(c)){
      if(c>=97){
        c -= 32;
      }
      return String.valueOf(c);
    }
  */

  static String toSmall(String s){
    return s.toLowerCase();
  }

  static String toBig(String s){
    return s.toUpperCase();
  }

  static String next(){
    return sc.next();
  }

  static int nextInt(){
    return Integer.parseInt(sc.next());
  }

  static long nextLong(){
    return Long.parseLong(sc.next());
  }

  static double nextDouble(){
    return Double.parseDouble(sc.next());
  }

  static String[] splitString(String s){
    return s.split("");
  }

  static char[] splitChar(String s){
    return s.toCharArray();
  }

  static int charToInt(char a){
    return a - 48;
  }

////////////////////////////////////////////
  public static int max(int[] a){
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
  public static long max(long[] a){
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
////////////////////////////////////////////

////////////////////////////////////////////
  public static int min(int[] a){
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
  public static long min(long[] a){
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
////////////////////////////////////////////

} Main static Scanner sc = new Scanner(System.in); sc new Scanner(System.in) static StringBuilder sb = new StringBuilder(); sb new StringBuilder() public static void main(String[] args) {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  } main {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  } long n = nextLong(); n nextLong() nextLong boolean ok = true; ok true if(n==1){
      ok = false;
    } n==1 n 1 {
      ok = false;
    } ok = false ok false String ans = ""; ans "" long memo = 0; memo 0 int lng = 0; lng 0 for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    } int i=0; int i=0; i 0 i<n i n i++ i++ i {
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    } {
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    } memo += (long)Math.pow(26,i) memo (long)Math.pow(26,i) Math.pow Math 26 i if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      } n<memo n memo {
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      } lng = i lng i break; long start = 1; start 1 for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    } int i=1; int i=1; i 1 i<=(lng-1) i (lng-1) lng 1 i++ i++ i {
      start += (long)Math.pow(26,i);
    } {
      start += (long)Math.pow(26,i);
    } start += (long)Math.pow(26,i) start (long)Math.pow(26,i) Math.pow Math 26 i long order = n - start + 1; order n - start + 1 n - start n start 1 int cnt = lng; cnt lng for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
} int x=0; int x=0; x 0 x<cnt x cnt x++ x++ x {
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
} {
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
} int block = 0; block 0 memo = 1 memo 1 for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    } int i=1; int i=1; i 1 i++ i++ i {
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    } {
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    } memo += (long)Math.pow(26,lng-1) memo (long)Math.pow(26,lng-1) Math.pow Math 26 lng-1 lng 1 if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      } order<memo order memo {
        block = i;
        ans += AAA(block);
        break;
      } block = i block i ans += AAA(block) ans AAA(block) AAA block break; lng-- lng n -= (long)(Math.pow(26,lng)) * block n (long)(Math.pow(26,lng)) * block (long)(Math.pow(26,lng)) Math.pow Math 26 lng block start = 1 start 1 for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    } int i=1; int i=1; i 1 i<=(lng-1) i (lng-1) lng 1 i++ i++ i {
      start += (long)Math.pow(26,i);
    } {
      start += (long)Math.pow(26,i);
    } start += (long)Math.pow(26,i) start (long)Math.pow(26,i) Math.pow Math 26 i order = n - start + 1 order n - start + 1 n - start n start 1 if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    } ok {
      System.out.println(ans);
    } System.out.println(ans) System.out.println System.out System System.out ans {
      System.out.println("a");
    } System.out.println("a") System.out.println System.out System System.out "a" String[] args args static String AAA(int block){
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  } AAA {
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  } switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    } block case 1: 1 case 1: return "a"; "a" case 2: 2 case 2: return "b"; "b" case 3: 3 case 3: return "c"; "c" case 4: 4 case 4: return "d"; "d" case 5: 5 case 5: return "e"; "e" case 6: 6 case 6: return "f"; "f" case 7: 7 case 7: return "g"; "g" case 8: 8 case 8: return "h"; "h" case 9: 9 case 9: return "i"; "i" case 10: 10 case 10: return "j"; "j" case 11: 11 case 11: return "k"; "k" case 12: 12 case 12: return "l"; "l" case 13: 13 case 13: return "m"; "m" case 14: 14 case 14: return "n"; "n" case 15: 15 case 15: return "o"; "o" case 16: 16 case 16: return "p"; "p" case 17: 17 case 17: return "q"; "q" case 18: 18 case 18: return "r"; "r" case 19: 19 case 19: return "s"; "s" case 20: 20 case 20: return "t"; "t" case 21: 21 case 21: return "u"; "u" case 22: 22 case 22: return "v"; "v" case 23: 23 case 23: return "w"; "w" case 24: 24 case 24: return "x"; "x" case 25: 25 case 25: return "y"; "y" case 26: 26 case 26: return "z"; "z" return "*"; "*" int block block static int lcm(int a,int b){
    return a*b*gcd(a,b);
  } lcm {
    return a*b*gcd(a,b);
  } return a*b*gcd(a,b); a*b*gcd(a,b) a*b*gcd(a,b) a b gcd(a,b) gcd a b int a a int b b static int gcd(int a,int b){
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  } gcd {
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  } if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    } a%b!=0 a%b a b 0 {
      return gcd(b,a%b);
    } return gcd(b,a%b); gcd(b,a%b) gcd b a%b a b {
      return b;
    } return b; b int a a int b b static String toSmall(String s){
    return s.toLowerCase();
  } toSmall {
    return s.toLowerCase();
  } return s.toLowerCase(); s.toLowerCase() s.toLowerCase s String s s static String toBig(String s){
    return s.toUpperCase();
  } toBig {
    return s.toUpperCase();
  } return s.toUpperCase(); s.toUpperCase() s.toUpperCase s String s s static String next(){
    return sc.next();
  } next {
    return sc.next();
  } return sc.next(); sc.next() sc.next sc static int nextInt(){
    return Integer.parseInt(sc.next());
  } nextInt {
    return Integer.parseInt(sc.next());
  } return Integer.parseInt(sc.next()); Integer.parseInt(sc.next()) Integer.parseInt Integer sc.next() sc.next sc static long nextLong(){
    return Long.parseLong(sc.next());
  } nextLong {
    return Long.parseLong(sc.next());
  } return Long.parseLong(sc.next()); Long.parseLong(sc.next()) Long.parseLong Long sc.next() sc.next sc static double nextDouble(){
    return Double.parseDouble(sc.next());
  } nextDouble {
    return Double.parseDouble(sc.next());
  } return Double.parseDouble(sc.next()); Double.parseDouble(sc.next()) Double.parseDouble Double sc.next() sc.next sc static String[] splitString(String s){
    return s.split("");
  } splitString {
    return s.split("");
  } return s.split(""); s.split("") s.split s "" String s s static char[] splitChar(String s){
    return s.toCharArray();
  } splitChar {
    return s.toCharArray();
  } return s.toCharArray(); s.toCharArray() s.toCharArray s String s s static int charToInt(char a){
    return a - 48;
  } charToInt {
    return a - 48;
  } return a - 48; a - 48 a 48 char a a ////////////////////////////////////////////
  public static int max(int[] a){
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  } max {
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  } int lng = a.length; lng a.length a a.length int max = a[0]; max a[0] a 0 for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    } int i=1; int i=1; i 1 i<lng i lng i++ i++ i {
      max = Math.max(max,a[i]);
    } {
      max = Math.max(max,a[i]);
    } max = Math.max(max,a[i]) max Math.max(max,a[i]) Math.max Math max a[i] a i return max; max int[] a a public static long max(long[] a){
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  } max {
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  } int lng = a.length; lng a.length a a.length long max = a[0]; max a[0] a 0 for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    } int i=1; int i=1; i 1 i<lng i lng i++ i++ i {
      max = Math.max(max,a[i]);
    } {
      max = Math.max(max,a[i]);
    } max = Math.max(max,a[i]) max Math.max(max,a[i]) Math.max Math max a[i] a i return max; max long[] a a ////////////////////////////////////////////
  public static int min(int[] a){
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  } min {
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  } int lng = a.length; lng a.length a a.length int min = a[0]; min a[0] a 0 for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    } int i=1; int i=1; i 1 i<lng i lng i++ i++ i {
      min = Math.min(min,a[i]);
    } {
      min = Math.min(min,a[i]);
    } min = Math.min(min,a[i]) min Math.min(min,a[i]) Math.min Math min a[i] a i return min; min int[] a a public static long min(long[] a){
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  } min {
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  } int lng = a.length; lng a.length a a.length long min = a[0]; min a[0] a 0 for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    } int i=1; int i=1; i 1 i<lng i lng i++ i++ i {
      min = Math.min(min,a[i]);
    } {
      min = Math.min(min,a[i]);
    } min = Math.min(min,a[i]) min Math.min(min,a[i]) Math.min Math min a[i] a i return min; min long[] a a public class Main{

  static Scanner sc = new Scanner(System.in);
  static StringBuilder sb = new StringBuilder();

  public static void main(String[] args) {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  }

  static String AAA(int block){
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  }



  static int lcm(int a,int b){
    return a*b*gcd(a,b);
  }

  static int gcd(int a,int b){
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  }

  /*
    static String toSmall(String s){
      char c = s.charAt(0);
      //if(Character.isUpperCase(c)){
      if(c<=90){
        c += 32;
      }
      return String.valueOf(c);
    }
    static String toBig(String s){
      char c = s.charAt(0);
      //if(Character.isLowerCase(c)){
      if(c>=97){
        c -= 32;
      }
      return String.valueOf(c);
    }
  */

  static String toSmall(String s){
    return s.toLowerCase();
  }

  static String toBig(String s){
    return s.toUpperCase();
  }

  static String next(){
    return sc.next();
  }

  static int nextInt(){
    return Integer.parseInt(sc.next());
  }

  static long nextLong(){
    return Long.parseLong(sc.next());
  }

  static double nextDouble(){
    return Double.parseDouble(sc.next());
  }

  static String[] splitString(String s){
    return s.split("");
  }

  static char[] splitChar(String s){
    return s.toCharArray();
  }

  static int charToInt(char a){
    return a - 48;
  }

////////////////////////////////////////////
  public static int max(int[] a){
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
  public static long max(long[] a){
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
////////////////////////////////////////////

////////////////////////////////////////////
  public static int min(int[] a){
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
  public static long min(long[] a){
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
////////////////////////////////////////////

} public class Main{

  static Scanner sc = new Scanner(System.in);
  static StringBuilder sb = new StringBuilder();

  public static void main(String[] args) {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  }

  static String AAA(int block){
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  }



  static int lcm(int a,int b){
    return a*b*gcd(a,b);
  }

  static int gcd(int a,int b){
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  }

  /*
    static String toSmall(String s){
      char c = s.charAt(0);
      //if(Character.isUpperCase(c)){
      if(c<=90){
        c += 32;
      }
      return String.valueOf(c);
    }
    static String toBig(String s){
      char c = s.charAt(0);
      //if(Character.isLowerCase(c)){
      if(c>=97){
        c -= 32;
      }
      return String.valueOf(c);
    }
  */

  static String toSmall(String s){
    return s.toLowerCase();
  }

  static String toBig(String s){
    return s.toUpperCase();
  }

  static String next(){
    return sc.next();
  }

  static int nextInt(){
    return Integer.parseInt(sc.next());
  }

  static long nextLong(){
    return Long.parseLong(sc.next());
  }

  static double nextDouble(){
    return Double.parseDouble(sc.next());
  }

  static String[] splitString(String s){
    return s.split("");
  }

  static char[] splitChar(String s){
    return s.toCharArray();
  }

  static int charToInt(char a){
    return a - 48;
  }

////////////////////////////////////////////
  public static int max(int[] a){
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
  public static long max(long[] a){
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
////////////////////////////////////////////

////////////////////////////////////////////
  public static int min(int[] a){
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
  public static long min(long[] a){
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
////////////////////////////////////////////

} Main
import java.util.*;

//update 2020/1/1 23:01

public class Main{

  static Scanner sc = new Scanner(System.in);
  static StringBuilder sb = new StringBuilder();

  public static void main(String[] args) {

    long n = nextLong();

    boolean ok = true;

    if(n==1){
      ok = false;
    }

    String ans = "";

    long memo = 0;

    int lng = 0;

    for(int i=0;i<n;i++){
      memo += (long)Math.pow(26,i);

      if(n<memo){
        lng = i;
        break;
        // nは26^i～26^(i+1)  *** 名前はlng文字
      }
    }

    //i文字のaaa...名前のスタートの番号
    long start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }

    long order = n - start + 1; //同じ長さの中でorder番目

    //先頭を決定する。
    //何ブロック目か

//lng回やる
int cnt = lng;
for(int x=0;x<cnt;x++){
////////////////////////////////////////////////
    int block = 0;
    memo = 1;
    for(int i=1;;i++){
      memo += (long)Math.pow(26,lng-1);
      if(order<memo){
        block = i;
        ans += AAA(block);
        break;
      }
    }

    //値の更新
    lng--;
    n -= (long)(Math.pow(26,lng)) * block;
    start = 1;
    for(int i=1;i<=(lng-1);i++){
      start += (long)Math.pow(26,i);
    }
    order = n - start + 1;

////////////////////////////////////////////////
}

    if(ok){
      System.out.println(ans);
    }
    else{
      System.out.println("a");
    }

  }

  static String AAA(int block){
    switch(block){
      case 1:
        return "a";
      case 2:
        return "b";
      case 3:
        return "c";
        case 4:
          return "d";
        case 5:
          return "e";
        case 6:
          return "f";
          case 7:
            return "g";
          case 8:
            return "h";
          case 9:
            return "i";
            case 10:
              return "j";
            case 11:
              return "k";
            case 12:
              return "l";
              case 13:
                return "m";
              case 14:
                return "n";
                case 15:
                  return "o";
                case 16:
                  return "p";
                case 17:
                  return "q";
                  case 18:
                    return "r";
                  case 19:
                    return "s";
                  case 20:
                    return "t";
                    case 21:
                      return "u";
                    case 22:
                      return "v";
                    case 23:
                      return "w";
                      case 24:
                        return "x";
                      case 25:
                        return "y";
                      case 26:
                        return "z";
    }
    return "*";
  }



  static int lcm(int a,int b){
    return a*b*gcd(a,b);
  }

  static int gcd(int a,int b){
    if(a%b!=0){
      return gcd(b,a%b);
    }
    else{
      return b;
    }
  }

  /*
    static String toSmall(String s){
      char c = s.charAt(0);
      //if(Character.isUpperCase(c)){
      if(c<=90){
        c += 32;
      }
      return String.valueOf(c);
    }
    static String toBig(String s){
      char c = s.charAt(0);
      //if(Character.isLowerCase(c)){
      if(c>=97){
        c -= 32;
      }
      return String.valueOf(c);
    }
  */

  static String toSmall(String s){
    return s.toLowerCase();
  }

  static String toBig(String s){
    return s.toUpperCase();
  }

  static String next(){
    return sc.next();
  }

  static int nextInt(){
    return Integer.parseInt(sc.next());
  }

  static long nextLong(){
    return Long.parseLong(sc.next());
  }

  static double nextDouble(){
    return Double.parseDouble(sc.next());
  }

  static String[] splitString(String s){
    return s.split("");
  }

  static char[] splitChar(String s){
    return s.toCharArray();
  }

  static int charToInt(char a){
    return a - 48;
  }

////////////////////////////////////////////
  public static int max(int[] a){
    int lng = a.length;
    int max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
  public static long max(long[] a){
    int lng = a.length;
    long max = a[0];
    for(int i=1;i<lng;i++){
      max = Math.max(max,a[i]);
    }
    return max;
  }
////////////////////////////////////////////

////////////////////////////////////////////
  public static int min(int[] a){
    int lng = a.length;
    int min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
  public static long min(long[] a){
    int lng = a.length;
    long min = a[0];
    for(int i=1;i<lng;i++){
      min = Math.min(min,a[i]);
    }
    return min;
  }
////////////////////////////////////////////

}
