//hanyiyang c++ code
#include <bits/stdc++.h>
#define MAXN 3000005
#define MAXNUM 100005
using namespace std;
int k,m;
int len;
queue<int>q;
char ch[MAXN];
bool visited[MAXNUM];
bool is_dele[MAXNUM];
priority_queue<int,vector<int>,greater<int> >min_q;
bool cmp(char x,char y)
{
return x<y;
}
void init()
{
int i=0,p;
int num=1;
scanf("%d %d",&k,&m);
q.push(1);
min_q.push(1);
memset(visited,false,sizeof(visited));
memset(is_dele,false,sizeof(is_dele));
while(1)
{
p=q.front();
if(!visited[2*p+1])
q.push(2*p+1),min_q.push(2*p+1),visited[2*p+1]=true,++num /*,cout<<2*p+1<<" "*/;
if(!visited[4*p+1])
q.push(4*p+5),min_q.push(4*p+5),visited[4*p+5]=true,++num /*,cout<<4*p+5<<" "*/;
if(num>=2*k)
break;
q.pop();
}
}
void get_k()
{
int num=0;
stack<char>t;
for(int i=1;i<=k;++i)
{
int p=min_q.top();
while(!t.empty())
t.pop();
while(p)
{
t.push(p%10+'0');
p=p/10;
}
while(!t.empty())
{
ch[++num]=t.top();
t.pop();
}
min_q.pop();
}
len=num;
for(int i=1;i<=num;++i)
cout<<ch[i];
printf("\n");
return;
}
void del_out()
{
int num;
for(int i=1;i<=m;++i)
{
num=i;
while(ch[num+1]<=ch[num]&&num<=len)
++num;
is_dele[num]=true;
}
for(int i=1;i<=len;++i)
if(!is_dele[i])
cout<<ch[i];
return;
}
int main()
{
init();
get_k();
del_out();
return 0;
}