import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Integer m = sc.nextInt();//苹果数量
        Integer n = sc.nextInt();//盘子数量
        Integer count = solve(m,n);
        System.out.println(count);
    }
    //动态规划 解题
    public static Integer solve(Integer m,Integer n){
        // 额外创建一行作为辅助行
        int[][] dp = new int[m+1][n+1];
        // 初始化(m-n=0时,1种摆法)(n=1, 1种摆法【可省略】)
        for (int j=0; j<n+1; j++) {
            dp[0][j] = 1;
        }
        // 遍历计算(f(m, n) = f(m, n-1) + f(m-n, n))
        for (int i=1; i<m+1; i++) {
            for (int j=1; j<n+1; j++) {
                dp[i][j] = dp[i][j-1] + (i < j ? 0 : dp[i-j][j]);
            }
        }
        return dp[m][n];
    }
/*  //递归 解题
    public static Integer solve(Integer m,Integer n){
        if (m==1||m==0||n==1){//0个苹果,n个盘子。或者 m个苹果,1个盘子。
            return 1;
        }else if(m<n){//苹果数量 < 盘子的数量。
            // 增加空盘子,不能增加解法的数量,所以按照m个盘子。
            // 调用solve函数 计算:
            // 将M个苹果放入M个盘子的解法数量
            return solve(m,m);
        } else {//else if (m>n)   苹果的数量 > 盘子的数量。
            // 1.保证每个盘子都有1个苹果,然后将剩下的,M-N个苹果放入N个盘子。
            // 2.只有一个盘子空着,然后将M个苹果放入N-1个盘子。
            // 分别调用solve函数 计算:
            // 将M-N个苹果放入N个盘子的解法数量
            //和将M个苹果放入N-1个盘子的解法数量
            return solve(m-n,n)+solve(m,n-1);

            //因为空盘子的数量不影响分法数量。所以按照一个空或者都满来递归计算。
        }
    }
    */
}