//递归做法
// #include<stdio.h>
// int fun(int m,int n)
// {
//     if(m==0||n==0)
//         return 1;
//     else
//         return fun(m,n-1)+fun(m-1,n);
//     }
// int main()
// {
//     int m,n;
//     while(scanf("%d%d",&n,&m)!=EOF)
//     {
//         printf("%d\n",fun(m,n));
//     }
// }


//排列组合的方法
// #include<stdio.h>
// int main()
// {
//     int n, m;

//     while(scanf("%d %d", &n, &m) != EOF) 
//     {
//         int up = 1, down = 1;
//         for(int i=0; i<n; i++) 
//         {
//             up *= m+n-i;
//             down *= i+1;
//         }
//         printf("%d\n", up/down);
//     }
// }


//动态规划做法
#include<stdio.h>
int main()
{
    int n, m;

    while(scanf("%d %d", &n, &m) != EOF) {
        int i, j, dp[n+1][m+1];

        for(i=0; i<=n; i++) {
            for(j=0; j<=m; j++) {
                if(i == 0 && j == 0) {
                    dp[i][j] = 1;
                    continue;
                }

                if(i == 0)
                    dp[i][j] = dp[i][j-1];
                else if(j == 0)
                    dp[i][j] = dp[i-1][j];
                else
                    dp[i][j] = dp[i][j-1] + dp[i-1][j];
            }
        }
        printf("%d\n", dp[n][m]);
    }
}