#include <bits/stdc++.h>
#define lli long long int
#define pb push_back
#define mod 1000000007
#pragma GCC optimize ("-O3")
#define mod2 998244353
#define MAXN 1000000000
#define v32 vector<int>
#define v64 vector<lli>
#define v1024 vector <vector <int>>
#define v4096 vector <vector <lli>>
#define vt vector
#define f(x, y, z) for (lli x = y; x < z; x++)
#define fd(x, y, z) for (lli x = y; x > z; x--)
#define lb lower_bound
#define ld long double
#define m64 map<lli,lli>
#define m32 map<int,int>
#define m64it map<lli,lli>::iterator
#define m32it map<int,int>::iterator
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define ist insert
#define endl "\n"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
#define p_q priority_queue 
#define min_p_q priority_queue <int,vt <int>,greater <int>>
using namespace std;
using namespace __gnu_pbds; 

template <typename T> 
void DEBUG_ARR(vt<T> a,char c)
{
	f(i,0,a.size())cout<<a[i]<<c;
	cout<<"\n";
}

//USE AT YOUR OWN RISK
lli tmod(lli x,lli m=mod){return (x%m+m)%m;}

//make sure x is below mod
lli power(lli x, lli y,lli m=mod) 
{
    lli res = 1;  
   
    while (y > 0) 
    { 
        if (y & 1) 
            res = (res*x)%m; 
        y = y>>1; 
        x = (x*x)%m;  
    }
    if(res<0)
       res+=m; 
    return res; 
}
//rank is equal to number of vertices in a connected component
class UnionFind 
{
  public: v32 p, rank;
  // remember: vi is vector<int>
  UnionFind(int N) { rank.assign(N, 1);
  p.assign(N, 0); for (int i = 0; i < N; i++) p[i] = i; }
  int findSet(int i) { return (p[i] == i) ? i : (p[i] = findSet(p[i])); }
  bool isSameSet(int i, int j) { return findSet(i) == findSet(j); }
  void unionSet(int i, int j) 
  {
  if (!isSameSet(i, j)) {
  // if from different set
  int x = findSet(i), y = findSet(j);
  if (rank[x] > rank[y]) p[y] = x,rank[x]+=rank[y];
  // rank keeps the tree short
  else 
     {
     p[x] = y;
     rank[y]+=rank[x]; 
     }
  
  } 
 
  }   
};
// lli fact[2000009];
// lli ncr(lli n,lli r){
//     lli ans=fact[n];
//     if(r>n)return 0;
//     ans=(ans*power(fact[n-r],mod-2))%mod;
//     ans=(ans*power(fact[r],mod-2))%mod;
//     return ans;
// }
// int mat[][]
v64 ans;
int main() 
{ 
    // fact[0]=1;
    // f(i,1,2000001)fact[i]=(i*fact[i-1])%mod;
    fastio;
    int t;
    // cin>>t;
    t=1;
    int temp=t;
	while(t--){
        // cout<<"Case #"<<temp-t<<": ";
        int k;cin>>k;
        lli dp[12][10];
        memset(dp,0,sizeof dp);
        f(i,1,12){
            f(j,0,10){
                if(i!=1)
                dp[i][j]=((j-1>-1)*dp[i-1][j-1]+dp[i-1][j]+(j+1<10)*dp[i-1][j+1]);
                else dp[i][j]=1;
            }
        }
        // cout<<dp[3][2]<<" "<<dp[2][1]<<" "<<dp[2][2]<<" "<<dp[2][3]<<"\n";
        // cout<<dp[1][5]<<"\n";
        lli l=1,r=3234566667;
        while(l<r){
            lli mid=(l+r)>>1;
            lli count=0;
            string x=to_string(mid);
            f(i,0,x.size()){
                if(i>0 && abs(x[i]-x[i-1])>1)break;
                lli upper=min(x[i]-'0'+2ll,10ll);
                if(i<x.size()-1)
                upper=min(upper,x[i+1]-'0'+0ll);
                f(j,max(0ll,x[i]-'0'-1ll),upper)count+=dp[x.size()-i-1][j];
                if(i+1==x.size())count++;
            }
            // cout<<count<<" ";
            f(j,0,x.size()){
                if(j==0)
                f(k,1,x[j]-'0')count+=dp[x.size()-j][k];
                else f(k,1,10)count+=dp[x.size()-j][k];
            }
            // cout<<mid<<" "<<count<<"\n";
            if(count>=k)r=mid;
            else l=mid+1;
        }
        cout<<l<<"\n";
    }   
    return 0; 	
}


Measured memory_bytes: 256