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