#define _USE_MATH_DEFINES #include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define MT make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)<; using vi = vector; using vll = vector; void solve() { // 無限に作れない場合は総当たりすればいい // どういう時に無限に作れるか // x and y = Nとして y-xの差をできるだけ小さくしようとする。 // Nが2進数で // 10011001011の場合 // 10..010011001011 y // 1..111111111111 x のように作ると必ずy-xは最小 // これがK以下なら無限に作れる int N, K; cin >> N >> K; int D = 0, z = N; while (z > 0) { z >>= 1; D++; } int y = (1 << D) | N; int x = (1 << D) - 1; if (y - x <= K) { cout << "INF" << endl; return; } int ans = 0; for (x = N; x <= 1000000; ++x) { if ((x&N) != N)continue; for (y = x; y <= x + K; ++y) { if ((x&y) == N) { ans++; } } } cout << ans << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(15); solve(); return 0; }