#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ws ws_____________________ #define y1 y1_____________________ #define y0 y0_____________________ #define left left_________________ #define right right_______________ #define next next_________________ #define prev prev_________________ #define hash hash_________________ #define pb push_back #define fst first #define snd second #define mp make_pair #define sz(C) ((int) (C).size()) #define forn(i, n) for (int i = 0; i < (int) n; ++i) #define ford(i, n) for (int i = ((int) n) - 1; i >= 0; --i) #define all(C) begin(C), end(C) typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; typedef pair pii; typedef pair pll; typedef vector vll; typedef vector vi; typedef vector > vvi; typedef vector vii; typedef long double ld; typedef complex cd; typedef vector vcd; #define FILE_NAME "a" const int MAXN = 1e5 + 10; int n, m; bool read() { if (scanf("%d%d", &n, &m) < 2) { return false; } return true; } map ans; ll solve(int n, int m) { // return min((n - 1) + n * 1ll * (m - 1), (m - 1) + m * 1ll * (n - 1)); if (n < m) { swap(n, m); } if (m == 1) { return n - 1; } pii C = mp(n, m); if (ans.count(C)) { return ans[C]; } return (ans[C] = 1 + solve(n / 2, m) + solve((n + 1) / 2, m)); } int main() { #ifdef LOCAL freopen(FILE_NAME ".in", "r", stdin); // freopen(FILE_NAME ".out", "w", stdout); #endif while (read()) { cout << solve(n, m) << endl; } #ifdef LOCAL cerr.precision(5); cerr << "Time: " << fixed << (double) clock() / CLOCKS_PER_SEC << endl; #endif return 0; }