#include <iostream>
 
using namespace std;
const int N = 205;
int n, k, ans;
 
//k:当前还需要拆分的份数
//P:上一份拆分的数字
//n:当前剩余待拆分的整数数值
void dfs(int k, int p, int n) //(初始状态:需要分 3 份,上一份的值为 0,剩余 7 要分配)
{
    if(k == 1) 
    {
        ans++;
        return;
    }
     
    for(int i = 1; i <= n / k; i++) 
    {
        if(i >= p)//避免重复,比如前面拆出较小的数,后面拆的数不小于前面的 
        {
            dfs(k - 1, i, n - i);
        }
    }
}
 
int main() 
{
    cin >> n >> k;
    dfs(k, 0, n);
    cout << ans ;  
    return 0;
}
//第一层递归(k=3;p=0;n=7)

//循环 i 从 1 到 n/k=7/3=2(即 i=1,2)
//条件 i >= p(p=0,所以 1 和 2 都满足)
//当 i=1 时:
//    递归调用 dfs(k=2, p=1, n=7-1=6);
//    进入第二层递归分支A
//当 i=2 时:
//    递归调用 dfs(k=2, p=2, n=7-2=5)
//    进入第二层递归分支B



//第二层递归

//分支 A:dfs(k=2, p=1, n=6)
//    循环 i 从 1 到 n/k=6/2=3(即 i=1,2,3)
//    条件 i >= p(p=1,所以 1、2、3 都满足)
//    A1:i=1 时:
//        递归调用 dfs(k=1, p=1, n=6-1=5)
//        满足 k==1,ans 加 1(ans=1,对应分法 1+1+5)
//    A2:i=2 时:
//        递归调用 dfs(k=1, p=2, n=6-2=4)
//        满足 k==1,ans 加 1(ans=2,对应分法 1+2+4)
//    A3:i=3 时:
//        递归调用 dfs(k=1, p=3, n=6-3=3)
//        满足 k==1,ans 加 1(ans=3,对应分法 1+3+3)

//分支 B:dfs(k=2, p=2, n=5)
//    循环 i 从 1 到 n/k=5/2=2(即 i=1,2)
//    条件 i >= p(p=2,只有 i=2 满足)
//    B1:i=2 时:
//        递归调用 dfs(k=1, p=2, n=5-2=3)
//        满足 k==1,ans 加 1(ans=4,对应分法 2+2+3)