#请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,
#总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。 #递归做法
def f(n,m):#从左上角到右下角,每次有两种走法,即右移一布或下移一布;当走到边界,即坐标点其中一个等于0,则只有一种走法
    if n==0 or m==0:
        return 1
    else:
        return f(n-1,m)+f(n,m-1)
while True:
    try:
        n,m=map(int,input().split())
        print(f(n,m))#老是把python3的括号忘了,囧
    except:
        break
//递归做法 #include <iostream>
using namespace std;
int f(int n,int m){
    int res;
    if(n==0 || m==0)
        res=1;
    else
        res=f(n-1,m)+f(n,m-1);
    return res;
}
int main(){
    int n,m;
    while(cin >> n >> m){
        int path_num=f(n,m);
        cout << path_num <<endl;
    }
}
//动态规划
#include <iostream>
#include <vector>
using namespace std;
int main(){
    int m,n;
    while(cin >> m >> n){
        vector<vector<int>> res(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){
                    res[i][j]=1;
                    continue;
                }
                if(i==0){
                    res[i][j]=res[i][j-1];
                }
                else if(j==0){
                    res[i][j]=res[i-1][j];
                }
                else {
                    res[i][j]=res[i][j-1]+res[i-1][j];
                }
            }
        }
        cout << res[n][m] <<endl;
    }
    return 0;
} //从左上角向右下角走,总计要向右走n次,向下走m次,一共走m+n次。 //则本题可以归为一个排列组合问题,即在总计m+n次中选出m次向下走的,即 #include <iostream>
using namespace std;
int main(){
    int m,n;
    while(cin >> m >> n){
        int up=1,down=1;
        for(int i=0;i<n;i++){
            up *=(m+n)-i;
            down *=i+1;
        }
        cout << up/down <<endl;
    }
}