#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")