#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 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];
static vector<int> byParity[2];
byParity[0].reserve(N/2+1); byParity[1].reserve(N/2+1);
ff(x, 0, N-1){
pc[x] = __builtin_popcount((unsigned)x);
byParity[pc[x]&1].pb(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;
}
}
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);
const auto &cand = byParity[needParity];
for (int nxt : cand){
int tmp = carry + pc[nxt];
int ncarry = (tmp >> 1);
int ncmp = (k>=2 ? ((cmp & eq[nxt]) | lt[nxt]) : 0);
add(f[i+1][ncmp][ncarry], f[i][cmp][carry]);
}
}
}
cout<<f[60][cmpAllOnes][0];
re;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZpbGUgIm8iCiNkZWZpbmUgZmYoaSwgYSwgYikgZm9yKGF1dG8gaT0oYSk7IGk8PShiKTsgKytpKQojZGVmaW5lIGZmcihpLCBiLCBhKSBmb3IoYXV0byBpPShiKTsgaT49KGEpOyAtLWkpCiNkZWZpbmUgbmwgIlxuIgojZGVmaW5lIHNzICIgIgojZGVmaW5lIHBiIGVtcGxhY2VfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgc3oocykgKGludClzLnNpemUoKQojZGVmaW5lIGFsbChzKSAocykuYmVnaW4oKSwgKHMpLmVuZCgpCiNkZWZpbmUgbXMoYSx4KSBtZW1zZXQoYSwgeCwgc2l6ZW9mIChhKSkKI2RlZmluZSBjbiBjb250aW51ZQojZGVmaW5lIHJlIGV4aXQoMCkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgdmVjdG9yPHBpaT4gdnBpaTsKdHlwZWRlZiB2ZWN0b3I8cGxsPiB2cGxsOwoKbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKbGwgcmFuKGxsIGwsIGxsIHIpCnsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248bGw+IChsLCByKShybmcpOwp9CgppbmxpbmUgdm9pZCByZigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsgY291dC50aWUobnVsbHB0cik7CiAgICBpZihmb3BlbihmaWxlIi5pbnAiLCJyIikpCiAgICB7CiAgICAgICAgZnJlb3BlbihmaWxlIi5pbnAiLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3BlbihmaWxlIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQp9Cgpjb25zdCBpbnQgbW9kPTk5ODI0NDM1MzsKY29uc3QgaW50IG1heG49MjAwMCsxNTsKY29uc3QgbGwgaW5mPTVlMTY7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBhZGQoVCAmeCwgY29uc3QgVCAmeSkKewogICAgeCs9eTsKICAgIGlmKHg+PW1vZCkgeC09bW9kOwogICAgaWYoeDwwKSB4Kz1tb2Q7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBib29sIG1heGkoVCAmYSwgVCBiKQp7CiAgICBpZihhPj1iKSByZXR1cm4gMDsKICAgIGE9YjsgcmV0dXJuIDE7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBib29sIG1pbmkoVCAmYSwgVCBiKQp7CiAgICBpZihhPD1iKSByZXR1cm4gMDsKICAgIGE9YjsgcmV0dXJuIDE7Cn0KCmlubGluZSBpbnQgbWFzayhpbnQgaSkKewogICAgcmV0dXJuICgxPDxpKTsKfQoKaW5saW5lIGJvb2wgYml0KGxsIHggLGludCBpKQp7CiAgICByZXR1cm4gKHg+PmkpJjE7Cn0KCmlubGluZSBib29sIGNvbXBhcmUoYm9vbCBiMSwgYm9vbCBiMiwgYm9vbCBjbXApCnsKICAgIGlmKGIxPGIyKSByZXR1cm4gMTsKICAgIGlmKGIxPmIyKSByZXR1cm4gMDsKICAgIHJldHVybiBjbXA7Cn0KCmxsIG47IGludCBrOwppbnQgZls2MV1bKDE8PDExKSsxXVsxMl07CgpzaWduZWQgbWFpbigpCnsKICAgIHJmKCk7CiAgICBjaW4+Pm4+Pms7IG4tPWs7CgogICAgY29uc3QgaW50IEMgID0gbWFzayhrLTEpOwogICAgY29uc3QgaW50IE4gID0gbWFzayhrKTsKICAgIGNvbnN0IGludCBjbXBBbGxPbmVzID0gQy0xOwogICAgY29uc3QgdW5zaWduZWQgbUsxID0gKGs+PTIgPyAodW5zaWduZWQpbWFzayhrLTEpLTF1IDogMHUpOwoKICAgIHN0YXRpYyBpbnQgcGNbMTw8MTFdOwogICAgc3RhdGljIGludCBsdFsxPDwxMV07CiAgICBzdGF0aWMgaW50IGVxWzE8PDExXTsKICAgIHN0YXRpYyB2ZWN0b3I8aW50PiBieVBhcml0eVsyXTsKCiAgICBieVBhcml0eVswXS5yZXNlcnZlKE4vMisxKTsgYnlQYXJpdHlbMV0ucmVzZXJ2ZShOLzIrMSk7CgogICAgZmYoeCwgMCwgTi0xKXsKICAgICAgICBwY1t4XSA9IF9fYnVpbHRpbl9wb3Bjb3VudCgodW5zaWduZWQpeCk7CiAgICAgICAgYnlQYXJpdHlbcGNbeF0mMV0ucGIoeCk7CiAgICAgICAgaWYgKGs+PTIpewogICAgICAgICAgICB1bnNpZ25lZCBhID0gKHVuc2lnbmVkKXg7CiAgICAgICAgICAgIHVuc2lnbmVkIGIgPSBhID4+IDE7CiAgICAgICAgICAgIHVuc2lnbmVkIGx0X21hc2sgPSAofmEpICYgYiAmIG1LMTsKICAgICAgICAgICAgdW5zaWduZWQgZ3RfbWFzayA9IGEgJiAofmIpICYgbUsxOwogICAgICAgICAgICB1bnNpZ25lZCBlcV9tYXNrID0gbUsxIF4gKGx0X21hc2sgfCBndF9tYXNrKTsKICAgICAgICAgICAgbHRbeF0gPSAoaW50KWx0X21hc2s7CiAgICAgICAgICAgIGVxW3hdID0gKGludCllcV9tYXNrOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBsdFt4XSA9IDA7IGVxW3hdID0gMDsKICAgICAgICB9CiAgICB9CgogICAgZlswXVswXVswXT0xOwoKICAgIGZmKGksIDAsIDU5KXsKICAgICAgICBpbnQgYmkgPSAoaW50KWJpdChuLCBpKTsKICAgICAgICBmZihjbXAsIDAsIEMtMSkgZmYoY2FycnksIDAsIGstMSkgaWYoZltpXVtjbXBdW2NhcnJ5XSl7CiAgICAgICAgICAgIGludCBuZWVkUGFyaXR5ID0gYmkgXiAoY2FycnkgJiAxKTsKICAgICAgICAgICAgY29uc3QgYXV0byAmY2FuZCA9IGJ5UGFyaXR5W25lZWRQYXJpdHldOwogICAgICAgICAgICBmb3IgKGludCBueHQgOiBjYW5kKXsKICAgICAgICAgICAgICAgIGludCB0bXAgPSBjYXJyeSArIHBjW254dF07CiAgICAgICAgICAgICAgICBpbnQgbmNhcnJ5ID0gKHRtcCA+PiAxKTsKICAgICAgICAgICAgICAgIGludCBuY21wID0gKGs+PTIgPyAoKGNtcCAmIGVxW254dF0pIHwgbHRbbnh0XSkgOiAwKTsKICAgICAgICAgICAgICAgIGFkZChmW2krMV1bbmNtcF1bbmNhcnJ5XSwgZltpXVtjbXBdW2NhcnJ5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY291dDw8Zls2MF1bY21wQWxsT25lc11bMF07CiAgICByZTsKfQo=