//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define file "o"
#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 push_back
#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)
using ll = long long;
const int mod=998244353;
template<typename T> inline void add(T &x, const T &y){
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
inline int mask(int i){ return (1<<i); }
inline bool bit(long long x ,long long i){ return (x>>i)&1; }
// so sánh bit-đôi với “ghi nhớ” trạng thái ở bit cao hơn
inline int compare(long long b1, long long b2, long long cmp){
if(b1<b2) return 1;
if(b1>b2) return 0;
return cmp;
}
long long n, k;
int f[63][(1<<11)+3][13];
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>k;
// chuyển strict-increasing (>=1) -> nondecreasing (>=0)
long long tri = k*(k+1)/2; // 1+2+...+k
if(n < tri){ cout<<0; return 0; }
n -= tri;
ms(f, 0);
f[0][0][0]=1;
// duyệt theo bit thấp -> cao để xử lý cộng với carry
ff(i, 0, 59)
ff(cmp, 0, mask((int)k-1)-1)
ff(carry, 0, (int)k-1) if(f[i][cmp][carry]){
ff(nxt, 0, mask((int)k)-1){
int ncmp=0;
ff(j, 0, (int)k-2){
if(compare(bit(nxt, j), bit(nxt, j+1), bit(cmp, j)))
ncmp |= mask(j);
}
int tmp = carry + __builtin_popcount(nxt); // popcount cho int
if(bit(n, i) != (tmp & 1)) cn;
int ncarry = (tmp >> 1); // tối đa k-1
add(f[i+1][ncmp][ncarry], f[i][cmp][carry]);
}
}
cout << f[60][mask((int)k-1)-1][0];
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmlsZSAibyIKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IoYXV0byBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgZmZyKGksIGIsIGEpIGZvcihhdXRvIGk9KGIpOyBpPj0oYSk7IC0taSkKI2RlZmluZSBubCAiXG4iCiNkZWZpbmUgc3MgIiAiCi8vI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHN6KHMpIChpbnQpcy5zaXplKCkKI2RlZmluZSBhbGwocykgKHMpLmJlZ2luKCksIChzKS5lbmQoKQojZGVmaW5lIG1zKGEseCkgbWVtc2V0KGEsIHgsIHNpemVvZiAoYSkpCiNkZWZpbmUgY24gY29udGludWUKI2RlZmluZSByZSBleGl0KDApCgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmNvbnN0IGludCBtb2Q9OTk4MjQ0MzUzOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgYWRkKFQgJngsIGNvbnN0IFQgJnkpewogICAgeCs9eTsKICAgIGlmKHg+PW1vZCkgeC09bW9kOwogICAgaWYoeDwwKSB4Kz1tb2Q7Cn0KCmlubGluZSBpbnQgbWFzayhpbnQgaSl7IHJldHVybiAoMTw8aSk7IH0KaW5saW5lIGJvb2wgYml0KGxvbmcgbG9uZyB4ICxsb25nIGxvbmcgaSl7IHJldHVybiAoeD4+aSkmMTsgfQoKLy8gc28gc8OhbmggYml0LcSRw7RpIHbhu5tpIOKAnGdoaSBuaOG7m+KAnSB0cuG6oW5nIHRow6FpIOG7nyBiaXQgY2FvIGjGoW4KaW5saW5lIGludCBjb21wYXJlKGxvbmcgbG9uZyBiMSwgbG9uZyBsb25nIGIyLCBsb25nIGxvbmcgY21wKXsKICAgIGlmKGIxPGIyKSByZXR1cm4gMTsKICAgIGlmKGIxPmIyKSByZXR1cm4gMDsKICAgIHJldHVybiBjbXA7Cn0KCmxvbmcgbG9uZyBuLCBrOwppbnQgZls2M11bKDE8PDExKSszXVsxM107CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4+Pm4+Pms7CgogICAgLy8gY2h1eeG7g24gc3RyaWN0LWluY3JlYXNpbmcgKD49MSkgLT4gbm9uZGVjcmVhc2luZyAoPj0wKQogICAgbG9uZyBsb25nIHRyaSA9IGsqKGsrMSkvMjsgICAgICAgIC8vIDErMisuLi4rawogICAgaWYobiA8IHRyaSl7IGNvdXQ8PDA7IHJldHVybiAwOyB9CiAgICBuIC09IHRyaTsKCiAgICBtcyhmLCAwKTsgCiAgICBmWzBdWzBdWzBdPTE7CgogICAgLy8gZHV54buHdCB0aGVvIGJpdCB0aOG6pXAgLT4gY2FvIMSR4buDIHjhu60gbMO9IGPhu5luZyB24bubaSBjYXJyeQogICAgZmYoaSwgMCwgNTkpIAogICAgICAgIGZmKGNtcCwgMCwgbWFzaygoaW50KWstMSktMSkgCiAgICAgICAgICAgIGZmKGNhcnJ5LCAwLCAoaW50KWstMSkgaWYoZltpXVtjbXBdW2NhcnJ5XSl7CiAgICAgICAgICAgICAgICBmZihueHQsIDAsIG1hc2soKGludClrKS0xKXsKICAgICAgICAgICAgICAgICAgICBpbnQgbmNtcD0wOwogICAgICAgICAgICAgICAgICAgIGZmKGosIDAsIChpbnQpay0yKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29tcGFyZShiaXQobnh0LCBqKSwgYml0KG54dCwgaisxKSwgYml0KGNtcCwgaikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNtcCB8PSBtYXNrKGopOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbnQgdG1wID0gY2FycnkgKyBfX2J1aWx0aW5fcG9wY291bnQobnh0KTsgLy8gcG9wY291bnQgY2hvIGludAogICAgICAgICAgICAgICAgICAgIGlmKGJpdChuLCBpKSAhPSAodG1wICYgMSkpIGNuOwogICAgICAgICAgICAgICAgICAgIGludCBuY2FycnkgPSAodG1wID4+IDEpOyAgICAgICAgICAgICAgICAgIC8vIHThu5FpIMSRYSBrLTEKICAgICAgICAgICAgICAgICAgICBhZGQoZltpKzFdW25jbXBdW25jYXJyeV0sIGZbaV1bY21wXVtjYXJyeV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgY291dCA8PCBmWzYwXVttYXNrKChpbnQpay0xKS0xXVswXTsKICAgIHJldHVybiAwOwp9Cg==