#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair P; long long int INF = 3e18; double Pi = 3.1415926535897932384626; vector G[500005]; vector

tree[500010]; priority_queue pql; priority_queue

pqp; //big priority queue priority_queue ,greater > pqls; priority_queue ,greater

> pqps; //small priority queue //top pop int dx[8]={1,0,-1,0,1,1,-1,-1}; int dy[8]={0,1,0,-1,1,-1,-1,1}; char dir[] = "DRUL"; //ll bit[500005]; //↓,→,↑,← #define p(x) cout<> n >> k; ll first = -1; for(i=30;i>=0;i--){ if(n & (1ll << i)){ first = i; break; } } //p(first); if(n == 0 && k == 0){ p(1); return 0; } if(first == -1){ p("INF"); return 0; } ll res = (1ll << (first + 1)); for(i=first-1;i>=0;i--){ if(!(n & (1ll << i))){ res -= (1ll << i); } } if(res <= k){ p("INF"); return 0; } dp[first][2000] = 1; for(i=first-1;i>=0;i--){ if(n & (1ll << i)){ for(j=0;j<4000;j++){ dp[i][j] = dp[i+1][j]; } }else{ for(j=0;j<4000;j++){ dp[i][j] += dp[i+1][j]; } for(j=0;j<4000;j++){ if(0 <= j + (1ll << i) && j + (1ll << i) <= 4000){ dp[i][j] += dp[i+1][j + (1ll << i)]; } if(0 <= j - (1ll << i) && j - (1ll << i) <= 4000){ dp[i][j] += dp[i+1][j - (1ll << i)]; } } } for(j=2000;j<2010;j++){ //pe(dp[i][j]); } //el; } ll ans = 0; for(i=k;i>=0;i--){ ans += dp[0][i + 2000]; } p(ans); return 0; }