#include <iostream>
#include <vector>
using namespace std;
/*
简单的动态规划,前几天第一次遇见时还没啥头绪
dp[i][j]表示走到点(i,j)的方法数
每次立足于当前坐标(i,j),回推上一步有两种选择,右 or 下到达(i,j)
dp[i][j] = dp[i-1][j] + dp[i][j-1]
边界:
dp[0][0] = 0;//起点
dp[0][j] = 1;//一路向右
dp[i][0] = 1;//一路向下
*/
int main() {
int n , m;
cin >> n >> m;
vector<vector<int> > dp(n+1,vector<int>(m+1,0));//初始化
for(int i = 0; i <= n; ++i){
for(int j = 0; j <= m; ++j){
if(i == 0 && j == 0){
dp[0][0] = 0;
}
else if(i == 0 ){
dp[i][j] = 1;
continue;
}
else if(j == 0) {
dp[i][j] = 1;
continue;
}
else {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
cout << dp[n][m];
}
// 64 位输出请用 printf("%lld")