//递归做法
// #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]);
}
}