#include <bits/stdc++.h>
using namespace std;
#define file "diduduadi"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
inline void rf()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen(file".inp","r"))
{
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
}
}
const int mod=998244353;
const int maxn=2000+15;
const ll inf=5e16;
template<typename T> inline void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template<typename T> inline bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template<typename T> inline bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
inline int mask(int i)
{
return (1<<i);
}
inline bool bit(ll x ,int i)
{
return (x>>i)&1;
}
inline bool compare(bool b1, bool b2, bool cmp)
{
if(b1<b2) return 1;
if(b1>b2) return 0;
return cmp;
}
ll n; int k;
int f[61][(1<<11)+1][12];
signed main()
{
rf();
cin>>n>>k; n-=k;
const int C = mask(k-1);
const int N = mask(k);
const int cmpAllOnes = C-1;
const unsigned mK1 = (k>=2 ? (unsigned)mask(k-1)-1u : 0u);
static int pc[1<<11];
static int lt[1<<11];
static int eq[1<<11];
ff(x, 0, N-1){
pc[x] = __builtin_popcount((unsigned)x);
if (k>=2){
unsigned a = (unsigned)x;
unsigned b = a >> 1;
unsigned lt_mask = (~a) & b & mK1;
unsigned gt_mask = a & (~b) & mK1;
unsigned eq_mask = mK1 ^ (lt_mask | gt_mask);
lt[x] = (int)lt_mask;
eq[x] = (int)eq_mask;
}else{
lt[x] = 0; eq[x] = 0;
}
}
vector<vector<vector<uint16_t>>> trans_idx(C, vector<vector<uint16_t>>(k+1));
vector<vector<vector<uint16_t>>> trans_cnt(C, vector<vector<uint16_t>>(k+1));
vector<int> cnt((k+1)*C);
ff(cmp,0,C-1){
fill(all(cnt),0);
ff(x,0,N-1){
int t = pc[x];
int ncmp = (k>=2 ? ((cmp & eq[x]) | lt[x]) : 0);
cnt[t*C + ncmp]++;
}
ff(t,0,k){
auto &vi = trans_idx[cmp][t];
auto &vc = trans_cnt[cmp][t];
vi.reserve(C/2+1);
vc.reserve(C/2+1);
ff(ncmp,0,C-1){
int c = cnt[t*C + ncmp];
if(c){
vi.push_back((uint16_t)ncmp);
vc.push_back((uint16_t)c);
}
}
}
}
f[0][0][0]=1;
ff(i, 0, 59){
int bi = (int)bit(n, i);
ff(cmp, 0, C-1) ff(carry, 0, k-1) if(f[i][cmp][carry]){
int needParity = bi ^ (carry & 1);
for (int t = needParity; t <= k; t += 2){
int ncarry = (carry + t) >> 1;
const auto &vi = trans_idx[cmp][t];
const auto &vc = trans_cnt[cmp][t];
int L = (int)vi.size();
int base = f[i][cmp][carry];
for (int j = 0; j < L; ++j){
int ncmp = vi[j];
int c = vc[j];
int mul = (int)((1LL * base * c) % mod);
add(f[i+1][ncmp][ncarry], mul);
}
}
}
}
cout<<f[60][cmpAllOnes][0];
re;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZpbGUgImRpZHVkdWFkaSIKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IoYXV0byBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgZmZyKGksIGIsIGEpIGZvcihhdXRvIGk9KGIpOyBpPj0oYSk7IC0taSkKI2RlZmluZSBubCAiXG4iCiNkZWZpbmUgc3MgIiAiCiNkZWZpbmUgcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBzeihzKSAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHMpIChzKS5iZWdpbigpLCAocykuZW5kKCkKI2RlZmluZSBtcyhhLHgpIG1lbXNldChhLCB4LCBzaXplb2YgKGEpKQojZGVmaW5lIGNuIGNvbnRpbnVlCiNkZWZpbmUgcmUgZXhpdCgwKQoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbDsKdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8bGw+IHZsbDsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7CnR5cGVkZWYgcGFpcjxsbCwgbGw+IHBsbDsKdHlwZWRlZiB2ZWN0b3I8cGlpPiB2cGlpOwp0eXBlZGVmIHZlY3RvcjxwbGw+IHZwbGw7CgptdDE5OTM3XzY0IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwpsbCByYW4obGwgbCwgbGwgcikKewogICAgcmV0dXJuIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxsbD4gKGwsIHIpKHJuZyk7Cn0KCmlubGluZSB2b2lkIHJmKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKICAgIGlmKGZvcGVuKGZpbGUiLmlucCIsInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKGZpbGUiLmlucCIsInIiLHN0ZGluKTsKICAgICAgICBmcmVvcGVuKGZpbGUiLm91dCIsInciLHN0ZG91dCk7CiAgICB9Cn0KCmNvbnN0IGludCBtb2Q9OTk4MjQ0MzUzOwpjb25zdCBpbnQgbWF4bj0yMDAwKzE1Owpjb25zdCBsbCBpbmY9NWUxNjsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB2b2lkIGFkZChUICZ4LCBjb25zdCBUICZ5KQp7CiAgICB4Kz15OwogICAgaWYoeD49bW9kKSB4LT1tb2Q7CiAgICBpZih4PDApIHgrPW1vZDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIGJvb2wgbWF4aShUICZhLCBUIGIpCnsKICAgIGlmKGE+PWIpIHJldHVybiAwOwogICAgYT1iOyByZXR1cm4gMTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIGJvb2wgbWluaShUICZhLCBUIGIpCnsKICAgIGlmKGE8PWIpIHJldHVybiAwOwogICAgYT1iOyByZXR1cm4gMTsKfQoKaW5saW5lIGludCBtYXNrKGludCBpKQp7CiAgICByZXR1cm4gKDE8PGkpOwp9CgppbmxpbmUgYm9vbCBiaXQobGwgeCAsaW50IGkpCnsKICAgIHJldHVybiAoeD4+aSkmMTsKfQoKaW5saW5lIGJvb2wgY29tcGFyZShib29sIGIxLCBib29sIGIyLCBib29sIGNtcCkKewogICAgaWYoYjE8YjIpIHJldHVybiAxOwogICAgaWYoYjE+YjIpIHJldHVybiAwOwogICAgcmV0dXJuIGNtcDsKfQoKbGwgbjsgaW50IGs7CmludCBmWzYxXVsoMTw8MTEpKzFdWzEyXTsKCnNpZ25lZCBtYWluKCkKewogICAgcmYoKTsKICAgIGNpbj4+bj4+azsgbi09azsKCiAgICBjb25zdCBpbnQgQyAgPSBtYXNrKGstMSk7CiAgICBjb25zdCBpbnQgTiAgPSBtYXNrKGspOwogICAgY29uc3QgaW50IGNtcEFsbE9uZXMgPSBDLTE7CiAgICBjb25zdCB1bnNpZ25lZCBtSzEgPSAoaz49MiA/ICh1bnNpZ25lZCltYXNrKGstMSktMXUgOiAwdSk7CgogICAgc3RhdGljIGludCBwY1sxPDwxMV07CiAgICBzdGF0aWMgaW50IGx0WzE8PDExXTsKICAgIHN0YXRpYyBpbnQgZXFbMTw8MTFdOwoKICAgIGZmKHgsIDAsIE4tMSl7CiAgICAgICAgcGNbeF0gPSBfX2J1aWx0aW5fcG9wY291bnQoKHVuc2lnbmVkKXgpOwogICAgICAgIGlmIChrPj0yKXsKICAgICAgICAgICAgdW5zaWduZWQgYSA9ICh1bnNpZ25lZCl4OwogICAgICAgICAgICB1bnNpZ25lZCBiID0gYSA+PiAxOwogICAgICAgICAgICB1bnNpZ25lZCBsdF9tYXNrID0gKH5hKSAmIGIgJiBtSzE7CiAgICAgICAgICAgIHVuc2lnbmVkIGd0X21hc2sgPSBhICYgKH5iKSAmIG1LMTsKICAgICAgICAgICAgdW5zaWduZWQgZXFfbWFzayA9IG1LMSBeIChsdF9tYXNrIHwgZ3RfbWFzayk7CiAgICAgICAgICAgIGx0W3hdID0gKGludClsdF9tYXNrOwogICAgICAgICAgICBlcVt4XSA9IChpbnQpZXFfbWFzazsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgbHRbeF0gPSAwOyBlcVt4XSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHZlY3Rvcjx2ZWN0b3I8dmVjdG9yPHVpbnQxNl90Pj4+IHRyYW5zX2lkeChDLCB2ZWN0b3I8dmVjdG9yPHVpbnQxNl90Pj4oaysxKSk7CiAgICB2ZWN0b3I8dmVjdG9yPHZlY3Rvcjx1aW50MTZfdD4+PiB0cmFuc19jbnQoQywgdmVjdG9yPHZlY3Rvcjx1aW50MTZfdD4+KGsrMSkpOwogICAgdmVjdG9yPGludD4gY250KChrKzEpKkMpOwoKICAgIGZmKGNtcCwwLEMtMSl7CiAgICAgICAgZmlsbChhbGwoY250KSwwKTsKICAgICAgICBmZih4LDAsTi0xKXsKICAgICAgICAgICAgaW50IHQgPSBwY1t4XTsKICAgICAgICAgICAgaW50IG5jbXAgPSAoaz49MiA/ICgoY21wICYgZXFbeF0pIHwgbHRbeF0pIDogMCk7CiAgICAgICAgICAgIGNudFt0KkMgKyBuY21wXSsrOwogICAgICAgIH0KICAgICAgICBmZih0LDAsayl7CiAgICAgICAgICAgIGF1dG8gJnZpID0gdHJhbnNfaWR4W2NtcF1bdF07CiAgICAgICAgICAgIGF1dG8gJnZjID0gdHJhbnNfY250W2NtcF1bdF07CiAgICAgICAgICAgIHZpLnJlc2VydmUoQy8yKzEpOwogICAgICAgICAgICB2Yy5yZXNlcnZlKEMvMisxKTsKICAgICAgICAgICAgZmYobmNtcCwwLEMtMSl7CiAgICAgICAgICAgICAgICBpbnQgYyA9IGNudFt0KkMgKyBuY21wXTsKICAgICAgICAgICAgICAgIGlmKGMpewogICAgICAgICAgICAgICAgICAgIHZpLnB1c2hfYmFjaygodWludDE2X3QpbmNtcCk7CiAgICAgICAgICAgICAgICAgICAgdmMucHVzaF9iYWNrKCh1aW50MTZfdCljKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmWzBdWzBdWzBdPTE7CgogICAgZmYoaSwgMCwgNTkpewogICAgICAgIGludCBiaSA9IChpbnQpYml0KG4sIGkpOwogICAgICAgIGZmKGNtcCwgMCwgQy0xKSBmZihjYXJyeSwgMCwgay0xKSBpZihmW2ldW2NtcF1bY2FycnldKXsKICAgICAgICAgICAgaW50IG5lZWRQYXJpdHkgPSBiaSBeIChjYXJyeSAmIDEpOwogICAgICAgICAgICBmb3IgKGludCB0ID0gbmVlZFBhcml0eTsgdCA8PSBrOyB0ICs9IDIpewogICAgICAgICAgICAgICAgaW50IG5jYXJyeSA9IChjYXJyeSArIHQpID4+IDE7CiAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZ2aSA9IHRyYW5zX2lkeFtjbXBdW3RdOwogICAgICAgICAgICAgICAgY29uc3QgYXV0byAmdmMgPSB0cmFuc19jbnRbY21wXVt0XTsKICAgICAgICAgICAgICAgIGludCBMID0gKGludCl2aS5zaXplKCk7CiAgICAgICAgICAgICAgICBpbnQgYmFzZSA9IGZbaV1bY21wXVtjYXJyeV07CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEw7ICsrail7CiAgICAgICAgICAgICAgICAgICAgaW50IG5jbXAgPSB2aVtqXTsKICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IHZjW2pdOwogICAgICAgICAgICAgICAgICAgIGludCBtdWwgPSAoaW50KSgoMUxMICogYmFzZSAqIGMpICUgbW9kKTsKICAgICAgICAgICAgICAgICAgICBhZGQoZltpKzFdW25jbXBdW25jYXJyeV0sIG11bCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY291dDw8Zls2MF1bY21wQWxsT25lc11bMF07CiAgICByZTsKfQo=