#include using namespace std; using ll = long long; // #define int ll using PII = pair; #define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i) #define REP(i, n) FOR(i, 0, n) #define ALL(x) x.begin(), x.end() template T &chmin(T &a, const T &b) { return a = min(a, b); } template T &chmax(T &a, const T &b) { return a = max(a, b); } template bool IN(T a, T b, T x) { return a<=x&&x T ceil(T a, T b) { return a/b + !!(a%b); } template vector make_v(size_t a) { return vector(a); } template auto make_v(size_t a,Ts... ts) { return vector(ts...))>(a,make_v(ts...)); } template typename enable_if::value==0>::type fill_v(T &t, const V &v) { t=v; } template typename enable_if::value!=0>::type fill_v(T &t, const V &v ) { for(auto &e:t) fill_v(e,v); } template ostream &operator <<(ostream& out,const pair& a){ out<<'('< ostream &operator <<(ostream& out,const vector& a){ out<<'['; for(T i: a) {out<> n >> K; if(n+1 <= K) { cout << "INF" << endl; return 0; } ll sz = 50; dp[0][0][0] = 1; REP(i, sz) REP(j, K+1) REP(k, 2) { if(dp[i][j][k] == 0) continue; // cout << i << " " << j << " " << k << endl; // (0, 0) if(!(n&1LL<<(sz-1-i))) { // cout << "a" << endl; dp[i+1][j][k] += dp[i][j][k]; } // (0, 1) if(!(n&1LL<<(sz-1-i)) && (j+(1LL<<(sz-1-i))) <= K) { // cout << "b" << endl; dp[i+1][j+(1<<(sz-1-i))][1] += dp[i][j][k]; } // (1, 0) if(!(n&1LL<<(sz-1-i)) && k==1 && j>=(1LL<<(sz-1-i))) { // cout << "c" << endl; dp[i+1][j-(1<<(sz-1-i))][k] += dp[i][j][k]; } // (1, 1) if(n&1LL<<(sz-1-i)) { // cout << "d" << endl; dp[i+1][j][k] += dp[i][j][k]; } } ll ret = 0; REP(i, K+1) ret += dp[sz][i][1] + dp[sz][i][0]; cout << ret << endl; // REP(j, 21) { // REP(i, K+1) cout << "(" << dp[j][i][0] << "," << dp[j][i][1] << ") "; // cout << endl; // } return 0; }