import java.util.Scanner;

public class Main {
	private static final String ALF = "abcdefghijklmnopqrstuvwxyz"; 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	}

	static String convertToName(long dog) {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	}
} import java.util.Scanner; Scanner java.util public class Main {
	private static final String ALF = "abcdefghijklmnopqrstuvwxyz"; 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	}

	static String convertToName(long dog) {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	}
} Main private static final String ALF = "abcdefghijklmnopqrstuvwxyz"; ALF "abcdefghijklmnopqrstuvwxyz" public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	} main {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) long dog = sc.nextLong(); dog sc.nextLong() sc.nextLong sc String dogName = convertToName(dog); dogName convertToName(dog) convertToName dog System.out.println(dogName.toString()) System.out.println System.out System System.out dogName.toString() dogName.toString dogName String[] args args static String convertToName(long dog) {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	} convertToName {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	} int digitNum = 1; digitNum 1 long[] digitParts = new long[15]; digitParts new long[15] 15 digitParts[0] = 26 digitParts[0] digitParts 0 26 long digitSum = 26; digitSum 26 for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		} int i = 0; int i = 0; i 0 digitSum < dog digitSum dog i++ i++ i {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		} {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		} digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum)) digitParts[i + 1] digitParts i + 1 i 1 (long) (Math.pow(ALF.length(), ++digitNum)) Math.pow Math ALF.length() ALF.length ALF ++digitNum digitNum digitSum += digitParts[i + 1] digitSum digitParts[i + 1] digitParts i + 1 i 1 int[] res = new int[digitNum]; res new int[digitNum] digitNum for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		} int i = 0; int i = 0; i 0 i < digitNum - 1 i digitNum - 1 digitNum 1 i++ i++ i {
			dog -= digitParts[i];
		} {
			dog -= digitParts[i];
		} dog -= digitParts[i] dog digitParts[i] digitParts i dog -- dog for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		} int i = digitNum - 1; int i = digitNum - 1; i digitNum - 1 digitNum 1 i > 0 i 0 i-- i-- i {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		} {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		} int rankNum = 0; rankNum 0 while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			} Math.pow(ALF.length(), i) * (rankNum + 1) <= dog Math.pow(ALF.length(), i) * (rankNum + 1) Math.pow(ALF.length(), i) Math.pow Math ALF.length() ALF.length ALF i (rankNum + 1) rankNum 1 dog {
				rankNum++;
			} rankNum++ rankNum res[digitNum - 1 - i] = rankNum res[digitNum - 1 - i] res digitNum - 1 - i digitNum - 1 - i digitNum 1 i rankNum dog -= Math.pow(ALF.length(), i) * rankNum dog Math.pow(ALF.length(), i) * rankNum Math.pow(ALF.length(), i) Math.pow Math ALF.length() ALF.length ALF i rankNum res[digitNum - 1] = (int) dog res[digitNum - 1] res digitNum - 1 digitNum 1 (int) dog StringBuffer dogName = new StringBuffer(); dogName new StringBuffer() for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		} int i = 0; int i = 0; i 0 i < res.length i res.length res res.length i++ i++ i {
			dogName = dogName.append(ALF.charAt(res[i]));
		} {
			dogName = dogName.append(ALF.charAt(res[i]));
		} dogName = dogName.append(ALF.charAt(res[i])) dogName dogName.append(ALF.charAt(res[i])) dogName.append dogName ALF.charAt(res[i]) ALF.charAt ALF res[i] res i return dogName.toString(); dogName.toString() dogName.toString dogName long dog dog public class Main {
	private static final String ALF = "abcdefghijklmnopqrstuvwxyz"; 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	}

	static String convertToName(long dog) {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	}
} public class Main {
	private static final String ALF = "abcdefghijklmnopqrstuvwxyz"; 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	}

	static String convertToName(long dog) {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	}
} Main
import java.util.Scanner;

public class Main {
	private static final String ALF = "abcdefghijklmnopqrstuvwxyz"; 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		long dog = sc.nextLong();

		String dogName = convertToName(dog);
		System.out.println(dogName.toString());
	}

	static String convertToName(long dog) {
		//文字数を特定する
		int digitNum = 1;
		long[] digitParts = new long[15];
		digitParts[0] = 26;
		long digitSum = 26;
		for (int i = 0; digitSum < dog; i++) {
			digitParts[i + 1] = (long) (Math.pow(ALF.length(), ++digitNum));
			digitSum += digitParts[i + 1];
		}
		
		int[] res = new int[digitNum];
		
		/// 与えられた数から桁数-1までの組み合わせ分だけ引く
		for (int i = 0; i < digitNum - 1; i++) {
			dog -= digitParts[i];
		}
		
		// 計算した数を26進数に変換する
		//0始まりとする
		dog --;
		for(int i = digitNum - 1; i > 0; i--) {
			int rankNum = 0;
			while(Math.pow(ALF.length(), i) * (rankNum + 1) <= dog) {
				rankNum++;
			}
			res[digitNum - 1 - i] = rankNum;
			dog -= Math.pow(ALF.length(), i) * rankNum;
		}
		res[digitNum - 1] = (int) dog;
		
		// 26進数を文字に変換する
		StringBuffer dogName = new StringBuffer();
		for (int i = 0; i < res.length; i++) {
			dogName = dogName.append(ALF.charAt(res[i]));
		}
		return dogName.toString();
	}
}
