#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
****************************************************************/