#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
#include <cmath>
using namespace std;

long longmax = 9223372036854775807;


vector<int> toarr(long v){
    // 0のときだけ例外的に 1桁
    if(v==0){
        vector<int> arr(1,0);
        return arr;
    }

    // 桁数を調べる
    int ketasuu = 0;
    long tmp = v;
    while(tmp!=0){
        tmp = tmp/10;
        ketasuu++;
    }

    // 1桁のとき1, 2桁のとき10, ... N桁のとき 10^(N-1)
    //long divider = 1; for(int i=0;i<ketasuu-1;i++){ divider *= 10; }
    long divider = pow(10,ketasuu-1);

    vector<int> arr(ketasuu,0);
    for(size_t i=0;i<arr.size();i++,divider/=10){
        arr[i] = (int) (v/divider%10);
    }
    return arr;
}


int kosuu(long maxv){
    // 一桁ずつ取り出して配列に
    vector<int> arr = toarr(maxv);

    // 前の数値が 0,1,2,3,...,9 の10状態
    vector< vector< vector<int> > > DP(arr.size(), vector< vector<int> >(2, vector<int>(10,0)));
    
    int low=0,geq=1;

    
    // 初期値
    for(size_t keta=0;keta<1;keta++){
        int tmpv = arr[keta];
        
        // 確定
        for(int i=0;i<10;i++){
            if(i<tmpv){
                DP[keta][low][i] = 1;
            }else if(i==tmpv){
                DP[keta][low][i] = 0;
            }else{
                DP[keta][low][i] = 0;
            }
        }
        // 未確定
        for(int i=0;i<10;i++){
            if(i<tmpv){
                DP[keta][geq][i] = 0;
            }else if(i==tmpv){
                DP[keta][geq][i] = 1;
            }else{
                DP[keta][geq][i] = 0;
            }
        }
    }

    // 初期値
    for(size_t keta=1;keta<arr.size();keta++){
        int tmpv = arr[keta];
        
        // 確定
        for(int i=0;i<1;i++){
            if(i<tmpv){
                DP[keta][low][i] = DP[keta-1][low][i] + DP[keta-1][low][i+1]
                                    + DP[keta-1][geq][i] + DP[keta-1][geq][i+1];
            }else if(i==tmpv){
                DP[keta][low][i] = DP[keta-1][low][i] + DP[keta-1][low][i+1];
            }else{
                DP[keta][low][i] = DP[keta-1][low][i] + DP[keta-1][low][i+1];
            }
        }
        for(int i=1;i<2;i++){
            if(i<tmpv){
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + DP[keta-1][low][i+1]
                                    + DP[keta-1][geq][i-1] + DP[keta-1][geq][i] + DP[keta-1][geq][i+1];
            }else if(i==tmpv){
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + DP[keta-1][low][i+1];
            }else{
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + DP[keta-1][low][i+1];
            }
        }
        // そこまですべて0な状態からやってくる +1 が必要
        for(int i=2;i<9;i++){
            if(i<tmpv){
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + DP[keta-1][low][i+1]
                                    + DP[keta-1][geq][i-1] + DP[keta-1][geq][i] + DP[keta-1][geq][i+1] + 1;
            }else if(i==tmpv){
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + DP[keta-1][low][i+1] + 1;
            }else{
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + DP[keta-1][low][i+1] + 1;
            }
        }
        for(int i=9;i<10;i++){
            if(i<tmpv){
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i]
                                    + DP[keta-1][geq][i-1] + DP[keta-1][geq][i] + 1;
            }else if(i==tmpv){
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + 1;
            }else{
                DP[keta][low][i] = DP[keta-1][low][i-1] + DP[keta-1][low][i] + 1;
            }
        }

        // 未確定
        for(int i=0;i<1;i++){
            if(i<tmpv){
                DP[keta][geq][i] = 0;
            }else if(i==tmpv){
                DP[keta][geq][i] = DP[keta-1][geq][i] + DP[keta-1][geq][i+1];
            }else{
                DP[keta][geq][i] = 0;
            }
        }
        for(int i=1;i<9;i++){
            if(i<tmpv){
                DP[keta][geq][i] = 0;
            }else if(i==tmpv){
                DP[keta][geq][i] = DP[keta-1][geq][i-1] + DP[keta-1][geq][i] + DP[keta-1][geq][i+1];
            }else{
                DP[keta][geq][i] = 0;
            }
        }
        for(int i=9;i<10;i++){
            if(i<tmpv){
                DP[keta][geq][i] = 0;
            }else if(i==tmpv){
                DP[keta][geq][i] = DP[keta-1][geq][i-1] + DP[keta-1][geq][i];
            }else{
                DP[keta][geq][i] = 0;
            }
        }
    }

    long result = DP[arr.size()-1][geq][arr[arr.size()-1]];
    for(int i=0;i<10;i++){ result += DP[arr.size()-1][low][i]; }
    return result-1; // 0だけは除外
}


int main(){

    int K;
    cin >> K;
    
    // 二分探索 & 桁DP
    long lowerBound = 0;
    long upperBound = longmax;
    long mid;
    int res;

    while(lowerBound!=upperBound-1){
        mid = lowerBound%2 && upperBound%2 ? lowerBound/2 + upperBound/2 + 1 : lowerBound/2 + upperBound/2;
        res = kosuu(mid);
        //cout << mid << " : " << res << endl;
        if(res>K){
            upperBound = mid;
        }else if(res==K){
            upperBound = mid;
        }else{
            lowerBound = mid;
        }
    }

    cout << upperBound << endl;
    

    return 0;
}


Measured memory_bytes: 256