#include using namespace std; using ll=long long; using ld=long double; using ull=unsigned long long; using uint=unsigned int; using pcc=pair; using pii=pair; using pll=pair; using pdd=pair; using tuplis=pair; using tuplis2=pair; template using pq=priority_queue,greater>; const ll LINF=0x1fffffffffffffff; const ll MOD=1000000007; const ll MODD=998244353; const int INF=0x3fffffff; const ld DINF=numeric_limits::infinity(); const ld EPS=1e-8; const vector four={{-1,0},{0,1},{1,0},{0,-1}}; #define _overload4(_1,_2,_3,_4,name,...) name #define _overload3(_1,_2,_3,name,...) name #define _rep1(n) for(ll i=0;i=0;i--) #define _rrep2(i,n) for(ll i=n-1;i>=0;i--) #define _rrep3(i,a,b) for(ll i=b-1;i>=a;i--) #define _rrep4(i,a,b,c) for(ll i=a+(b-a-1)/c*c;i>=a;i-=c) #define rrep(...) _overload4(__VA_ARGS__,_rrep4,_rrep3,_rrep2,_rrep1)(__VA_ARGS__) #define each(i,a) for(auto &i:a) #define sum(...) accumulate(range(__VA_ARGS__),0LL) #define dsum(...) accumulate(range(__VA_ARGS__),double(0)) #define _range(i) (i).begin(),(i).end() #define _range2(i,k) (i).begin(),(i).begin()+k #define _range3(i,a,b) (i).begin()+a,(i).begin()+b #define range(...) _overload3(__VA_ARGS__,_range3,_range2,_range)(__VA_ARGS__) #define _rrange(i) (i).rbegin(),(i).rend() #define _rrange2(i,k) (i).rbegin(),(i).rbegin()+k #define _rrange3(i,a,b) (i).rbegin()+a,(i).rbegin()+b #define rrange(...) _overload3(__VA_ARGS__,_rrange3,_rrange2,_rrange)(__VA_ARGS__) #define elif else if #define unless(a) if(!(a)) #define mp make_pair #define mt make_tuple #define INT(...) int __VA_ARGS__;in(__VA_ARGS__) #define LL(...) ll __VA_ARGS__;in(__VA_ARGS__) #define STR(...) string __VA_ARGS__;in(__VA_ARGS__) #define CHR(...) char __VA_ARGS__;in(__VA_ARGS__) #define DBL(...) double __VA_ARGS__;in(__VA_ARGS__) #define vec(type,name,...) vector name(__VA_ARGS__) #define VEC(type,name,size) vector name(size);in(name) #define vv(type,name,h,...) vector>name(h,vector(__VA_ARGS__)) #define VV(type,name,h,...) vector>name(h,vector(__VA_ARGS__));in(name) #define vvv(type,name,h,w,...) vector>>name(h,vector>(w,vector(__VA_ARGS__))) struct SETTINGS{SETTINGS(){cout< inline constexpr T min(vector &v){return *min_element(range(v));} inline char min(string &v){return *min_element(range(v));} template inline constexpr T max(vector &v){return *max_element(range(v));} inline char max(string &v){return *max_element(range(v));} inline constexpr ll intpow(const ll&a,const ll&b){if(b==0)return 1;ll ans=intpow(a,b/2);return ans*ans*(b&1?a:1);} inline constexpr ll modpow(const ll&a,const ll&b,const ll&mod=MOD){if(b==0)return 1;ll ans=modpow(a,b/2,mod);ans=ans*ans%mod;if(b&1)ans=ans*a%mod;return ans;} template inline constexpr bool update_min(T &mn,const T &cnt){if(mn>cnt){mn=cnt;return 1;}else return 0;} template inline constexpr bool update_max(T &mx,const T &cnt){if(mx &vec){ for(unsigned i = 0; i < vec.size(); i++) { int a; scan(a); vec[i] = a; } } template inline void scan(vector &vec); template inline void scan(array &vec); template inline void scan(pair &p); template inline void scan(T (&vec)[size]); template inline void scan(vector &vec){ for(auto &i : vec) scan(i); } template inline void scan(array &vec){ for(auto &i : vec) scan(i); } template inline void scan(pair &p){ scan(p.first); scan(p.second); } template inline void scan(T (&vec)[size]){ for(auto &i : vec) scan(i); } template inline void scan(T &a){ cin>>a; } inline void in(){} template inline void in(Head &head, Tail&... tail){ scan(head); in(tail...); } inline void print(){ putchar('\n'); } inline void print(const bool &a){ printf("%d", a); } inline void print(const int &a){ printf("%d", a); } inline void print(const unsigned &a){ printf("%u", a); } inline void print(const long &a){ printf("%ld", a); } inline void print(const long long &a){ printf("%lld", a); } inline void print(const unsigned long long &a){ printf("%llu", a); } inline void print(const char &a){ printf("%c", a); } inline void print(const char a[]){ printf("%s", a); } inline void print(const float &a){ printf("%.10f", a); } inline void print(const double &a){ printf("%.10f", a); } inline void print(const long double &a){ printf("%.10Lf", a); } template void print(const vector &vec); template void print(const array &vec); template void print(const pair &p); template inline void print(const T (&vec)[size]); template void print(const vector &vec){ print(vec[0]); for(auto i = vec.begin(); ++i != vec.end(); ){ putchar(' '); print(*i); } } template void print(const array &vec){ print(vec[0]); for(auto i = vec.begin(); ++i != vec.end(); ){ putchar(' '); print(*i); } } template void print(const pair &p){ print(p.first); putchar(' '); print(p.second); } template inline void print(const T (&vec)[size]){ print(vec[0]); for(auto i = vec; ++i != end(vec); ){ putchar(' '); print(*i); } } template inline void print(const T &a){ cout << a; } inline bool out(){ putchar('\n'); return 0; } template inline bool out(const T &t){ print(t); putchar('\n'); return 0; } template inline bool out(const Head &head, const Tail&... tail){ print(head); putchar(' '); out(tail...); return 0; } template inline void err(T t){cerr<d; ll n,k; vector>mem(20); ll dp(ll at,ll sum){ if(at==d.size())return sum<=k; if(mem[at].count(sum))return mem[at][sum]; return mem[at][sum]=dp(at+1,sum)+dp(at+1,d[at]-sum)+dp(at+1,d[at]+sum); } int main(){ in(n,k); ull a=1; a<<=63; a|=n; rep(k){ a--; if((a&n)==n)return out("INF"); } rep(20)unless((n>>i)&1)d.push_back(1ll<