#include<bits/stdc++.h>
using namespace std;
// #pragma GCC optimize("Ofast,unroll-loops,fast-math")
// #pragma GCC target("avx2,sse4,bmi,popcnt")
#define int long long
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define RREP(i,n) for(int i=(n)-1;i>=0;i--)
#define RREP1(i,n) for(int i=(n);i>=1;i--)
#define f first
#define s second
#define pb push_back
#define ALL(x) (x).begin(),(x).end()
#define ALL1(x) (x).begin()+1,(x).end()
#define SZ(x) (int)((x).size())
#define SQ(x) (x)*(x)
#define pii pair<int,int>
#define pipii pair<int,pii>
#define Graph vector<vector<int>>
#define Graphw vector<vector<pii>>
#define IOS() ios::sync_with_stdio(0),cin.tie(0)
#define md(x) (((x)%(mod)+(mod))%(mod))
#define MD(x,M) (((x)%(M)+(M))%(M))
#define ld long double
#define pdd pair<ld,ld>
#define chmax(x,y) x=max(x,y)
#define chmin(x,y) x=min(x,y)
#define addmod(x,y) x=((x+(y))%mod)
#define Vi vector<int>
#ifdef LOCAL
#define op(x) cout<<(#x)<<"="<<(x)<<", ";
#define ope(x) cout<<(#x)<<"="<<(x)<<endl;
#define oparr(x) cout<<(#x)<<":";for(auto &mken:(x)) cout<<mken<<" ";cout<<" size="<<(x).size()<<endl;
#define entr cout<<endl;
#else
#define op(x) ;
#define ope(x) ;
#define oparr(x) ;
#define entr ;
#endif
const int mod=30011;
const int maxn=2e4+5;
const int maxn2=2e5+5;
const int maxb=20;
const int inf=(1ll<<62);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rd(int l,int r) {
return uniform_int_distribution<int>(l,r)(rng);
}
int pw(int x,int p) {
int r=1;
while(p>0) {
if(p&1) r=r*x%mod;
x=x*x%mod;
p>>=1;
}
return r;
}
int inv(int x) {
return pw(x,mod-2);
}
Vi fac(maxn),infac(maxn);
int C(int n,int k) {
return (fac[n]*infac[k]%mod)*infac[n-k]%mod;
}
bool isp(int n) {
for(int i=2;i*i<=n;i++) if(n%i==0) return 0;return 1;
}
int dp(int n,int k) {
if(k<0) return 0;
if(k==0) return 1;
int r=0;
int x=__lg(k + 1),y=k-(1<<x);
for(int i=0;i<=n;i+=2) {
addmod(r,(i==n?dp(i,y):pw(y+1,i)*pw(2,x*(n-i-1)))*C(n,i));
}
return r;
}
signed main() {
IOS();
fac[0]=1;
REP1(i,maxn-1) fac[i]=fac[i-1]*i%mod;
infac[maxn-1]=inv(fac[maxn-1]);
RREP(i,maxn-1) infac[i]=infac[i+1]*(i+1)%mod;
int n,k;
cin>>n>>k;
int r=dp(n,k);
int an=pw(k+1,n)-r;
an=(an+mod)%mod;
cout<<an<<'\n';
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0LHVucm9sbC1sb29wcyxmYXN0LW1hdGgiKQovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsc3NlNCxibWkscG9wY250IikKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgUkVQKGksbikgZm9yKGludCBpPTA7aTwobik7aSsrKQojZGVmaW5lIFJFUDEoaSxuKSBmb3IoaW50IGk9MTtpPD0obik7aSsrKQojZGVmaW5lIFJSRVAoaSxuKSBmb3IoaW50IGk9KG4pLTE7aT49MDtpLS0pCiNkZWZpbmUgUlJFUDEoaSxuKSBmb3IoaW50IGk9KG4pO2k+PTE7aS0tKQojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIEFMTCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSBBTEwxKHgpICh4KS5iZWdpbigpKzEsKHgpLmVuZCgpCiNkZWZpbmUgU1ooeCkgKGludCkoKHgpLnNpemUoKSkKI2RlZmluZSBTUSh4KSAoeCkqKHgpCiNkZWZpbmUgcGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBwaXBpaSBwYWlyPGludCxwaWk+CiNkZWZpbmUgR3JhcGggdmVjdG9yPHZlY3RvcjxpbnQ+PgojZGVmaW5lIEdyYXBodyB2ZWN0b3I8dmVjdG9yPHBpaT4+CiNkZWZpbmUgSU9TKCkgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCksY2luLnRpZSgwKQojZGVmaW5lIG1kKHgpICgoKHgpJShtb2QpKyhtb2QpKSUobW9kKSkKI2RlZmluZSBNRCh4LE0pICgoKHgpJShNKSsoTSkpJShNKSkKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIHBkZCBwYWlyPGxkLGxkPgojZGVmaW5lIGNobWF4KHgseSkgeD1tYXgoeCx5KQojZGVmaW5lIGNobWluKHgseSkgeD1taW4oeCx5KQojZGVmaW5lIGFkZG1vZCh4LHkpIHg9KCh4Kyh5KSklbW9kKQojZGVmaW5lIFZpIHZlY3RvcjxpbnQ+CiNpZmRlZiBMT0NBTAojZGVmaW5lIG9wKHgpIGNvdXQ8PCgjeCk8PCI9Ijw8KHgpPDwiLCAiOwojZGVmaW5lIG9wZSh4KSBjb3V0PDwoI3gpPDwiPSI8PCh4KTw8ZW5kbDsKI2RlZmluZSBvcGFycih4KSBjb3V0PDwoI3gpPDwiOiI7Zm9yKGF1dG8gJm1rZW46KHgpKSBjb3V0PDxta2VuPDwiICI7Y291dDw8IiBzaXplPSI8PCh4KS5zaXplKCk8PGVuZGw7CiNkZWZpbmUgZW50ciBjb3V0PDxlbmRsOwojZWxzZQojZGVmaW5lIG9wKHgpIDsKI2RlZmluZSBvcGUoeCkgOwojZGVmaW5lIG9wYXJyKHgpIDsKI2RlZmluZSBlbnRyIDsKI2VuZGlmCmNvbnN0IGludCBtb2Q9MzAwMTE7CmNvbnN0IGludCBtYXhuPTJlNCs1Owpjb25zdCBpbnQgbWF4bjI9MmU1KzU7CmNvbnN0IGludCBtYXhiPTIwOwpjb25zdCBpbnQgaW5mPSgxbGw8PDYyKTsgCm10MTk5Mzcgcm5nKGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CmludCByZChpbnQgbCxpbnQgcikgewogICAgcmV0dXJuIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+KGwscikocm5nKTsKfQppbnQgcHcoaW50IHgsaW50IHApIHsKICAgIGludCByPTE7CiAgICB3aGlsZShwPjApIHsKICAgICAgICBpZihwJjEpIHI9cip4JW1vZDsKICAgICAgICB4PXgqeCVtb2Q7CiAgICAgICAgcD4+PTE7CiAgICB9CiAgICByZXR1cm4gcjsKfQppbnQgaW52KGludCB4KSB7IAogICAgcmV0dXJuIHB3KHgsbW9kLTIpOwp9ClZpIGZhYyhtYXhuKSxpbmZhYyhtYXhuKTsKaW50IEMoaW50IG4saW50IGspIHsKICAgIHJldHVybiAoZmFjW25dKmluZmFjW2tdJW1vZCkqaW5mYWNbbi1rXSVtb2Q7Cn0KYm9vbCBpc3AoaW50IG4pIHsKICAgIGZvcihpbnQgaT0yO2kqaTw9bjtpKyspIGlmKG4laT09MCkgcmV0dXJuIDA7cmV0dXJuIDE7Cn0KaW50IGRwKGludCBuLGludCBrKSB7CiAgICBpZihrPDApIHJldHVybiAwOwogICAgaWYoaz09MCkgcmV0dXJuIDE7CiAgICBpbnQgcj0wOwogICAgaW50IHg9X19sZyhrICsgMSkseT1rLSgxPDx4KTsKICAgIGZvcihpbnQgaT0wO2k8PW47aSs9MikgewogICAgICAgIGFkZG1vZChyLChpPT1uP2RwKGkseSk6cHcoeSsxLGkpKnB3KDIseCoobi1pLTEpKSkqQyhuLGkpKTsKICAgIH0KICAgIHJldHVybiByOwp9CnNpZ25lZCBtYWluKCkgewogICAgSU9TKCk7CiAgICBmYWNbMF09MTsKICAgIFJFUDEoaSxtYXhuLTEpIGZhY1tpXT1mYWNbaS0xXSppJW1vZDsKICAgIGluZmFjW21heG4tMV09aW52KGZhY1ttYXhuLTFdKTsKICAgIFJSRVAoaSxtYXhuLTEpIGluZmFjW2ldPWluZmFjW2krMV0qKGkrMSklbW9kOwogICAgaW50IG4sazsKICAgIGNpbj4+bj4+azsKICAgIGludCByPWRwKG4sayk7CiAgICBpbnQgYW49cHcoaysxLG4pLXI7CiAgICBhbj0oYW4rbW9kKSVtb2Q7CiAgICBjb3V0PDxhbjw8J1xuJzsKICAgIHJldHVybiAwOwp9