Link to this code: https://cses.fi/paste/bd877b68b537ebf1d8c91d/
/* 777 */
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int INF = 1e9 + 5;
const int N = 500;
int dp[N + 1][N + 1];

// dp(i, j) -> min no. of moves to convert a ixj rectangle into squares

void pre() {
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= N; ++j) {
            dp[i][j] = (i == j) ? 0 : INF;
            if (i == j) continue;
            for (int k = 1; k < j; ++k) {
                dp[i][j] = min(dp[i][j], 1 + dp[i][k] + dp[i][j - k]);  // fix i
            }
            for (int k = 1; k < i; ++k) {
                dp[i][j] = min(dp[i][j], 1 + dp[k][j] + dp[i - k][j]);  // fix j
            }
        }
    }
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    pre();
    int i, j;
    cin >> i >> j;
    cout << dp[i][j];
}