#include #include #include #include #include #include #include using namespace std; int findMinSquers(long long n, long long m){ if(n == 1) return m-1; if(m == 1) return n-1; long long minimum = INT_MAX; for(long long i = 1 ; i < n/2 + 1 ; i++ ){ long long res1 = findMinSquers(i,m); long long res2 = findMinSquers(n-i , m); if(res1 + res2 + 1 < minimum){ minimum = res1 + res2 + 1; } } long long minimum2 = INT_MAX; for(long long i = 1 ; i < m/2 + 1 ; i++ ){ long long res1 = findMinSquers(n,i); long long res2 = findMinSquers(n ,m - i); if(res1 + res2 + 1 < minimum2){ minimum2 = res1 + res2 + 1; } } return min(minimum, minimum2); } // To execute C++, please define "int main()" int main() { int n , m; cin >> n >> m; vector > arr(n + 1 , vector(m + 1, (m+3) * (n+3))); for(int i = 1 ; i <= n ; i++){ arr[i][1] = i - 1; } for(int i = 1 ; i <= m ; i++){ arr[1][i] = i - 1; } for(int i = 2 ; i <= n ; i++){ for(int j = 2 ; j <= m ; j++){ for(int k = 1 ; k < i ; k++){ if(arr[k][j] + arr[i-k][j] + 1 < arr[i][j]){ arr[i][j] = arr[k][j] + arr[i-k][j] + 1; } } for(int k = 1 ; k < i ; k++){ if(arr[i][k] + arr[i][j - k] + 1 < arr[i][j]){ arr[i][j] = arr[i][k] + arr[i][j-k] + 1; } } } } // long long res = findMinSquers(n,m); cout << arr[n][m]<< endl; return 0; }