#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;
}