//// "و ذا النون اذ ذهب مغاضبا فظن ان لن نقدر عليه"
//// "فنادي في الظلمات ان لا اله لا انت سبحانك اني كنت من الظالمين"
//// "فاستجبنا له و نجينه من الغم و كذلك ننجي المؤمنين"
// MORE FALLS , HIGHER JUMPS YOU GET !! //
#include <bits/stdc++.h>
#define ll long long
#define Zhraa ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr);
#define YES "YES"
#define NO "NO"
#define sp ' '
#define nl '\n'
#define ON(mask,bit) (mask | (1LL<<bit) )
#define OFF(mask,bit) ( mask & ~ ( 1LL << bit ) )
#define IsOn(mask,bit) (( mask>>bit) & 1LL)
#define toggle(mask,bit)( mask ^ (1LL<<bit) )
#define IsOdd(mask) (mask & 1LL)
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <cstring>
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>
// down up right left
int dx []={ 1 , -1 , 0 , 0 , -1 ,1,-1, 1 };
int dy []={ 0 , 0 , 1 , -1 , -1 ,1, 1,-1 };
char dir[] = {'D', 'U' , 'R' , 'L'};
const ll MOD = 1e9 + 7;
const int N = 500 + 3 ;
const int oo = 0x3f3f3f3f;
const ll ooLL = 0x3f3f3f3f3f3f3f3f;
///////////////////////////////////////// The Code ///////////////////////////////////////////
// constant
// state
int a,b;
ll dp [N][N];
ll go (int i,int j){ // calc min moves to get sqrs from dimensions
if(i==1&&j==1)
return 1;
if(~dp[i][j])
return dp[i][j];
ll ans = ooLL;
if(i!=1){
for (int k = 1; k < i; ++k) {// cuting vertical
ll op1 = go(k, j)%MOD;
ll op2 = go(i - k, j);
if(k==i-k)
ans = min(ans, op1);
else
ans= min(ans,op1+op2);
}
}
if(j!=1){
for (int k = 1; k < j; ++k) {//cutting horizontal
ll op1 = go(i, k);
ll op2 = go(i, j - k);
if(k==j-k)
ans = min(ans, op1);
else
ans= min(ans,op1+op2);
}
}
return dp[i][j]=ans;
}
void solve(){
cin>>a>>b;
memset(dp,-1,sizeof dp);
cout<<go(a,b);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
Zhraa
int t =1;
//cin>>t;
while (t--)
solve();
}
Ly8vLyAi2Ygg2LDYpyDYp9mE2YbZiNmGINin2LAg2LDZh9ioINmF2LrYp9i22KjYpyDZgdi42YYg2KfZhiDZhNmGINmG2YLYr9ixINi52YTZitmHIgovLy8vICLZgdmG2KfYr9mKINmB2Yog2KfZhNi42YTZhdin2Kog2KfZhiDZhNinINin2YTZhyDZhNinINin2YbYqiDYs9io2K3Yp9mG2YMg2KfZhtmKINmD2YbYqiDZhdmGINin2YTYuNin2YTZhdmK2YYiCi8vLy8gICLZgdin2LPYqtis2KjZhtinINmE2Ycg2Ygg2YbYrNmK2YbZhyDZhdmGINin2YTYutmFINmIINmD2LDZhNmDINmG2YbYrNmKINin2YTZhdik2YXZhtmK2YYiCi8vIE1PUkUgRkFMTFMgLCBISUdIRVIgSlVNUFMgWU9VIEdFVCAhISAvLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgWmhyYWEgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUobnVsbHB0cik7Y291dC50aWUobnVsbHB0cik7CiNkZWZpbmUgWUVTICJZRVMiCiNkZWZpbmUgTk8gIk5PIgojZGVmaW5lIHNwICcgJwojZGVmaW5lIG5sICdcbicKI2RlZmluZSBPTihtYXNrLGJpdCkgKG1hc2sgfCAoMUxMPDxiaXQpICkKI2RlZmluZSBPRkYobWFzayxiaXQpICggbWFzayAmIH4gKCAxTEwgPDwgYml0ICkgKQojZGVmaW5lIElzT24obWFzayxiaXQpICgoIG1hc2s+PmJpdCkgJiAxTEwpCiNkZWZpbmUgdG9nZ2xlKG1hc2ssYml0KSggbWFzayBeICgxTEw8PGJpdCkgKQojZGVmaW5lIElzT2RkKG1hc2spIChtYXNrICYgMUxMKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KI2luY2x1ZGUgPGNzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwojZGVmaW5lIG9yZGVyZWRfc2V0IHRyZWU8bGwsIG51bGxfdHlwZSxsZXNzPGxsPiwgcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPgoKCi8vICAgICAgICBkb3duICAgdXAgcmlnaHQgIGxlZnQKaW50IGR4IFtdPXsgMSAsIC0xICwgMCAsICAwICAgICAsIC0xICwxLC0xLCAxIH07CmludCBkeSBbXT17IDAgLCAgMCAsIDEgLCAtMSAgICAgLCAtMSAsMSwgMSwtMSB9OwpjaGFyIGRpcltdID0geydEJywgJ1UnICwgJ1InICwgJ0wnfTsKCmNvbnN0IGxsIE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBOID0gNTAwICsgMyA7CmNvbnN0IGludCBvbyA9IDB4M2YzZjNmM2Y7CmNvbnN0IGxsIG9vTEwgPSAweDNmM2YzZjNmM2YzZjNmM2Y7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBUaGUgQ29kZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBjb25zdGFudAovLyBzdGF0ZQppbnQgYSxiOwpsbCAgZHAgW05dW05dOwpsbCBnbyAoaW50IGksaW50IGopeyAvLyBjYWxjIG1pbiBtb3ZlcyB0byBnZXQgc3FycyBmcm9tIGRpbWVuc2lvbnMKCiAgICBpZihpPT0xJiZqPT0xKQogICAgICAgIHJldHVybiAxOwogICAgaWYofmRwW2ldW2pdKQogICAgICAgIHJldHVybiBkcFtpXVtqXTsKCiAgICBsbCBhbnMgPSBvb0xMOwogICAgaWYoaSE9MSl7CiAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPCBpOyArK2spIHsvLyBjdXRpbmcgdmVydGljYWwKICAgICAgICAgICAgbGwgb3AxID0gZ28oaywgaiklTU9EOwogICAgICAgICAgICBsbCBvcDIgPSBnbyhpIC0gaywgaik7CiAgICAgICAgICAgIGlmKGs9PWktaykKICAgICAgICAgICAgICAgIGFucyA9IG1pbihhbnMsIG9wMSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFucz0gbWluKGFucyxvcDErb3AyKTsKICAgICAgICB9CiAgICB9CgogICAgaWYoaiE9MSl7CiAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPCBqOyArK2spIHsvL2N1dHRpbmcgaG9yaXpvbnRhbAogICAgICAgICAgICBsbCBvcDEgPSBnbyhpLCBrKTsKICAgICAgICAgICAgbGwgb3AyID0gZ28oaSwgaiAtIGspOwogICAgICAgICAgICBpZihrPT1qLWspCiAgICAgICAgICAgICAgICBhbnMgPSBtaW4oYW5zLCBvcDEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBhbnM9IG1pbihhbnMsb3AxK29wMik7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkcFtpXVtqXT1hbnM7Cn0KCgp2b2lkIHNvbHZlKCl7CiAgICBjaW4+PmE+PmI7CiAgICBtZW1zZXQoZHAsLTEsc2l6ZW9mIGRwKTsKICAgIGNvdXQ8PGdvKGEsYik7CiAgIAp9CgoKaW50IG1haW4oKSB7CgojaWZuZGVmIE9OTElORV9KVURHRQogICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwojZW5kaWYKCiAgICBaaHJhYQoKICAgIGludCB0ID0xOwogICAgLy9jaW4+PnQ7CgogICAgd2hpbGUgKHQtLSkKICAgICAgICBzb2x2ZSgpOwoKCn0K