#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
const int N(100);
struct bign{
int num[N];
};
bign f[600][519];
void give(bign &t,int s)
{
t.num[0]=0;
while(s)
{
t.num[0]++;
t.num[t.num[0]]=s%10;
s/=10;
}
}
void add(bign &a,bign &b)
{
int l=max(a.num[0],b.num[0]);
a.num[0]=l;
for(int i=1;i<=l;i++)
{
a.num[i]+=b.num[i];
a.num[i+1]+=a.num[i]/10;
a.num[i]%=10;
}
if(a.num[a.num[0]+1])
a.num[0]++;
}
int main()
{
int k,w;bign ans;
fill(ans.num,ans.num+N,0);
ans.num[0]=1;
cin>>k>>w;
int n(ceil(w/(1.0*k))),b=(int)(pow(2.0,(double)k));
for(int i=0;i<519;i++)
for(int j=0;j<519;j++)
{
fill(f[i][j].num+1,f[i][j].num+N,0);
f[i][j].num[0]=1;
}
for(int i=1;i<=b-2;i++)
give(f[2][i],b-1-i);
for(int i=3;i<=n-1&&i<b;i++)
for(int j=b-i;j>=1;j--)
{
add(f[i][j],f[i-1][j+1]);
add(f[i][j],f[i][j+1]);
}
int t=w-(n-1)*k;
int nb(0);
for(int i=0;i<t;i++)
nb+=(int)pow(2.0,(double)i);
for(int j=1;j<=nb&&j<=b-n;j++)
for(int k=j+1;k<=b-n+1;k++)
add(f[n][j],f[n-1][k]);
for(int i=1;i<=n;i++)
for(int j=1;j<b;j++)
add(ans,f[i][j]);
for(int i=ans.num[0];i>=1;i--)
printf("%d",ans.num[i]);
cout<<endl;
return 0;
}
/**************************************************************
Problem: 2267
User: admin
Language: C++
Result: Accepted
Time:1263 ms
Memory:123964 kb
****************************************************************/