using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoders {
	class Program {
		static void Main(string[] args) {
				var inputArray = retreiveLongArray();
			var inputCount = 1;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}
			var K = inputArray[0];
			var lunlunTable = new long[12][];

			//一番最初の桁に注目する。Array1は1桁めで、最初の桁が0~9のときのLunLunの数
			lunlunTable[0] = new long[10] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

			for (int i = 1; i < 12; i++) {
				lunlunTable[i] = getNextLunlunArray(lunlunTable[i - 1]);
			}

			var ketaInitial = getKeta_Initial(lunlunTable, K);

			var keta = ketaInitial.keta;
			var remain = ketaInitial.remain;
			var ans = ketaInitial.initial.ToString();
			var ini = ketaInitial.initial;

			while (keta > 0) {

				//iniが0の時は特別な処理とする
				if (ini == 0) {
					if (remain <=  lunlunTable[keta - 1][ini]) {
						ans = ans + (ini);
					}
					else {
						ans = ans + (ini + 1);
						remain -= + lunlunTable[keta - 1][ini];
						ini = ini + 1;
					}
					keta--;
					continue;
				}


				//iniが1意外
				if (remain <= lunlunTable[keta - 1][ini-1]) {
					ans = ans + (ini - 1);
					ini = ini - 1;

				}
				else if (remain <= lunlunTable[keta - 1][ini - 1]+ lunlunTable[keta - 1][ini]) {
					ans = ans + (ini);
					remain -= lunlunTable[keta - 1][ini - 1];
				}
				else {
					ans = ans + (ini+1);
					remain -= lunlunTable[keta - 1][ini - 1]+ lunlunTable[keta - 1][ini];
					ini = ini + 1;
				}
				keta--;
			}
			Console.WriteLine(ans);

		}

		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static KetaInital getKeta_Initial(long[][] lunlunTable, long K) {

			long remain = K;

			for (int keta = 0; keta < 12; keta++) {
				for (int initial = 1; initial <= 9; initial++) {
					if (remain <= lunlunTable[keta][initial]) {

						//if (initial == 1) {
							//return new KetaInital(keta - 1, 9, remain);
						//}//
						return new KetaInital(keta, initial , remain);
					}
					remain = remain - lunlunTable[keta][initial];

				}
			}
			//このコードは通らない想定
			return new KetaInital(-1, -1,1);

		}


		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] getNextLunlunArray(long[] lunlunArray) {
			var nextLunlunArray = new long[10];

			for (int i = 0; i < 10; i++) {
				long value = 0;

				if (i - 1 >= 0) {
					value += lunlunArray[i - 1];
				}
				value += lunlunArray[i];

				if (i + 1 < 10) {
					value += lunlunArray[i + 1];
				}

				nextLunlunArray[i] = value;
			}

			return nextLunlunArray;
		}



		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray = Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}

	public class KetaInital {
		public int keta { get; set; }
		public int initial { get; set; }
		public long remain { get; set; }


		public KetaInital(int k,int i,long r) {
			keta = k;
			initial = i;
			remain = r;
		}
	}
}


Measured memory_bytes: 13396