#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <queue> #include <stack> #include <string> #include <bitset> #include <cstdio> #include <limits> #include <vector> #include <climits> #include <cstring> #include <cstdlib> #include <fstream> #include <numeric> #include <sstream> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; map<string,long>dp; long cuts(int n,int m){ if(dp.find(n+"_"+m)!=dp.end())return dp[n+"_"+m]; if(n>=m){ if(n%2) dp[n+"_"+m]= cuts(n/2,m)+cuts(n/2+1,m); else dp[n+"_"+m] = 2*cuts(n/2,m); } else{ if(m%2) dp[n+"_"+m]= cuts(n,m/2)+cuts(n,m/2+1); else dp[n+"_"+m] = 2*cuts(n,m/2); } return dp[n+"_"+m]; } int main(){ int n; int m; cin >> n >> m; dp[1+"_"+1]=1; cout<<cuts(n,m); return 0; }