#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using P = pair; constexpr int INF = 1001001001; constexpr int mod = 1000000007; // constexpr int mod = 998244353; template inline bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } template inline bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, K; cin >> N >> K; if(N == 0){ if(K == 0) cout << 1 << '\n'; else cout << "INF\n"; return 0; } int msb = -1; for(int k = 20; k >= 0; --k){ if(N >> k & 1){ msb = k; break; } } int x = 0; for(int k = 0; k < msb; ++k){ if(N >> k & 1) continue; x += 1 << k; } if((1 << (msb + 1)) - x <= K){ cout << "INF\n"; return 0; } vector ks; for(int k = msb - 1; k >= 0; --k){ if(N >> k & 1) continue; ks.emplace_back(k); } int n = ks.size(); ll ans = 0; auto dfs = [&](auto&& self, int i = 0, int sum = 0, int f = 0) -> void { if(i == n){ ans += sum <= K; return; } int k = ks[i]; // (x, y) -> (0, 1) self(self, i + 1, sum + (1 << k), f | 1); // (x, y) -> (0, 0) self(self, i + 1, sum, f); // (x, y) -> (1, 0) if(f) self(self, i + 1, sum - (1 << k), f); }; dfs(dfs); cout << ans << '\n'; return 0; }