#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>   
using namespace std;
using namespace __gnu_pbds;
typedef long long ll; 
#define int long long
typedef unsigned long long lu;
typedef vector<ll> v;
typedef vector<vector<ll> > vv;
typedef vector<string>  vs;
typedef vector<pair<ll,ll>> vpr;
typedef long double ld;
#define f(i,n) for(ll i = 0; i < n; i++)
#define ff(i,n) for(ll i=1;i<=n;i++)
#define pb push_back
#define mp make_pair
#define endl "\n"
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define amax(x,y) if(y>x) x=y;
#define amin(x,y) if(y<x)x=y;
#define bg(x) x.begin()
#define sz(x) (ll)x.size()
#define in(x,n) for(ll i=0;i<n;i++)cin>>x[i]
#define out(x,n) for(ll i=0;i<n;i++)cout<<x[i]<<" " 
#define mxt(a) *(max_element(a.begin(),a.end()))
#define mnt(a) *(min_element(a.begin(),a.end())
#define tc ll t;cin>>t;while(t--)
typedef pair<ll,ll> pi;
#define yes cout<<"YES\n";
#define no cout<<"NO\n";
#define yesno(f) if(f) yes else no
const v dx = {1, -1, 0, 0};
const v dy = {0, 0, 1, -1};
const ll mod=1e9+7;
const ld PI = 2 * acos(0.0);
ll m(ll a){ return (a+mod)%mod;}
ll cel(ll x1,ll y1){if((x1%y1)==0)return x1/y1;else return x1/y1+1;}
ll power(ll a,ll b,ll m)
{
	if(b==0)
		return 1;
	ll d=power(a,b/2,m);
	d=(d*d)%m;
	if(b&1)
		d=(d*a)%m;
	return d;
}
// set_name.find_by_order(k) It returns to an iterator to the kth element (counting from zero) in the set in O(logn) time
// set_name.order_of_key(k) It returns to the number of items that are strictly smaller than our item k in O(logn) time.
/*string operations :
str.substr (x,y) : returns a substring str[x],str[x+1],...str[x+y-1]
str.substr (x) : returns a substring str[x],... end of string
str.find(qtr) : returns the first occurenece of qtr in str */
int solve(){}
int32_t main()
{
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	int k;cin>>k;
	int n=40;
	vv dp(10,v(n+1,0));
	f(i,10)dp[i][1]=1;
	v cnt(n,0);
	cnt[1]=9;
	cnt[0]=1;
	for(int i=2;i<=n;i++)
	{
		dp[0][i]=dp[1][i-1]+dp[0][i-1];
		for(int j=1;j<=8;j++)
		{
			dp[j][i]=dp[j][i-1]+dp[j+1][i-1]+dp[j-1][i-1];
		}
		dp[9][i]=dp[9][i-1]+dp[8][i-1];
		for(int j=1;j<10;j++)
			cnt[i]+=dp[j][i];
	}
	// cout<<cnt[20];
	int l=1;
	// cout<<k<<endl;
	while(cnt[l] < k)k-=cnt[l],l++;
	v ans;
	// cout<<l<<endl;
	// return 0;
	// cout<<cnt[2]<<endl;
	// for(int j=1;j<10;j++)
		// cout<<dp[j][l]<<" ";
	for(int j=1;j<10;j++)
	{
		if(dp[j][l] < k)
			k-=dp[j][l];
		else
		{
			ans.pb(j);
			break;
		}
	}
	for(int i=1;i<l;i++)
	{
		int lt=ans[sz(ans)-1];
		if(lt==0)
		{
			if(dp[0][l-i] < k)
			{
				k-=dp[0][l-i];
				ans.pb(1);
			}
			else
				{
					ans.pb(0);
					continue;
				}

		}
		else if(lt==9)
		{
			if(dp[8][l-i]  < k)
			{
				k-=dp[8][l-i];
				ans.pb(9);

			}
			else
			{
				ans.pb(8);
				continue;
			}
		}
		else
		{
			if(dp[lt-1][l-i] < k)
			{
				k-=dp[lt-1][l-i];
			}
			else
			{
				ans.pb(lt-1);
				continue;
			}
			if(dp[lt][l-i] < k)
				k-=dp[lt][l-i];
			else
			{
				ans.pb(lt);continue;
			}
			ans.pb(lt+1);
		}
	}
		for(auto it:ans)cout<<it;
	// for(int i=0;i<l;i++)cout<<ans[i];
	return 0;
}

Measured memory_bytes: 256