def get_count(n, m):  # n是横向格子数,m是竖向格子数
    # 初始化dp,dp[i][j]表示从(0,0)移动到(i,j)的路线数量
    dp = [[0] * m for _ in range(n)]

    # 初始化边界条件
    # 第一列
    for i in range(n):
        dp[i][0] = 1  # 第一列初始化为 1
        # 第一行
    for j in range(m):
        dp[0][j] = 1  # 第一行初始化为 1

    # 动态转移方程
    for i in range(1, n):
        for j in range(1, m):
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

    return dp[n - 1][m - 1]  # 返回到达 (n-1, m-1) 的路径数量


# 输入横向格子数 n 和 竖向格子数 m
n, m = map(int, input().split())

print(get_count(n+1, m+1))  # 输出路径数量,注意因为初始点是(0,0)这里调用的时候必须是要加1的,