# 由於n和m都是10^18的范圍,暴力明顯不行,只能dfs了。
# 先預處理n的十進制,存到num數組中,長度計算出來為len, 答案存到Num中。
# 寫個函數cntOfBeginNum(int *Num,int anslen),計算以num為前綴的小於等於n的數的個數cnt,考慮長度比n的十進制長度小的數,則cnt+=1+10+100+1000......
# 長度和n相等的則要特判一下,前綴Num和num的前綴有3種關系,> = < ,先判斷是哪種,再計算。
# 然后考慮答案的最高位非0,我們從1到9枚舉,如果cnt=cntOfBeginNum(Num,1)>=m,則dfs()下去。否則,m-=cnt;
# 然后dfs函數里面,如果m==1,那么直接輸出當前值就是答案了。。 比如當前值是23,如果m是1,答案是23(以一個數為前綴的字典序最小的就是它本身)。 否則再枚舉第3高位,從
# 0~9枚舉進行dfs....
# 其實也可以不dfs,壓根沒有回溯。 直接走一步算一步就是了。
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
const int maxn=20;
int len;
int num[maxn],ans[maxn];
long long n,m;
void printans(int *ans,int cnt){
for(int i=1;i<=cnt;i++)cout<<ans[i];
puts("");
}
void init(){
len=0;
while(n){
num[++len]=n%10;
//cout<<len<<" "<<num[len]<<endl;
n/=10;
}
//cout<<"len:"<<len<<endl;
}
long long valuebeginIndex(int beg){
long long cnt=0;
for(int i=beg;i<=len;i++){
cnt=cnt*10+num[len-i+1];
}
return cnt;
}
long long cntOfBeginNum(int *Num,int anslen){
long long k=1;
long long cnt=0;
for(int i=0;i+anslen<len;i++){
cnt+=k;
k*=10;
}
int op=0;
for(int i=1;i<=anslen;i++){
int id=len-i+1;
if(num[id]>Num[i]){
op=-1;
break;
}
else if(num[id]<Num[i]){
op=1;
break;
}
}
//cout<<" op:"<<op<<endl;
if(op==0){
if(anslen==len)return 1;
return valuebeginIndex(anslen+1)+1+cnt;
}
else if(op==1){
return cnt;
}
else {
long long k=1;
for(int i=0;i<len-anslen;i++)k*=10;
return cnt+k;
}
}
void dfs(int *ans,int cur,long long m){
//printans(ans,cur);
if(m==1){
printans(ans,cur);
return;
}
m--;
for(int i=0;i<=9;i++){
ans[cur+1]=i;
long long cnt=cntOfBeginNum(ans,cur+1);
//cout<<i<<" "<<m<<" " <<cnt<<endl;
if(cnt>=m){
dfs(ans,cur+1,m);
return;
}
else m-=cnt;
}
}
void run(){
init();
for(int i=1;i<=9;i++){
ans[1]=i;
long long cnt=cntOfBeginNum(ans,1);
//cout<<i<<" "<<cnt<<" "<<m<<endl;
if(cnt>=m){
dfs(ans,1,m);
break;
}
else m-=cnt;
}
}
int main(){
//freopen("in","r",stdin);
while(cin>>n>>m)run();
return 0;
}