// dp[i][j]表示将i+1个苹果放在j+1个盘子中的不同分法
// 一共分为三种情况,i,j
// 第一种,当苹果数i小于盘子数j,一定有一个盘子没放苹果,所以等价于(i, j-1);
// 第二种,当苹果数i等于盘子数j,将盘子放满只有一种情况,即每个都为1,然后加上盘子不放满的情况,所以等价于(i, j-1)+1;
// 第三种,当苹果数i大于盘子数j,盘子放满的话,相当于每个盘子中的苹果数都减一(手动写一下就容易发现),即(i-j, j);
// 然后加上盘子不放满的情况,所以等价于(i, j-1)+(i-j, j);
// 则遍历顺序从上到下,左到右**
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int m = scanner.nextInt();
int n = scanner.nextInt();
System.out.println(count(m, n));
}
scanner.close();
}
public static int count(int m, int n){
int[][] dp = new int[m][n];
// 初始化
for(int i = 0; i < m; i++) dp[i][0] = 1;
for(int i = 0; i < n; i++) dp[0][i] = 1;
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(i > j){
dp[i][j] = dp[i-j-1][j] + dp[i][j-1];//mark,由于dp含义,手动写一下
}else if(i == j){
dp[i][j] = dp[i][j-1] + 1;
}else{
dp[i][j] = dp[i][j-1];
}
}
}
//打印dp数组
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
System.out.print(dp[i][j] + " ");
}
System.out.println();
}
return dp[m-1][n-1];
}
}