#include<iostream>
#include<cstdio>
using namespace std;
int gs=0,n,k;
void sou(int x,int y,int z)
{///x是剩下要被分解的数值,y是剩下的要分解成多少份,z是上一份的数值
if(y==1 && x<z)///剩下的数不够分解了
return;
if(y==1 && x>=z)///一次分解成功
{
gs++;
return;
}
for(int i=z; i<=x/y; i++)
{
/*
关于为什么枚举到x/y这个问题,是为了保证不重不漏,即从较小的数开始枚举,
然后使得这个数后面的数都不小于当前的数即可,
所以也可以i枚举到x,然后加个像下面一样的特判
不过嘛,测试了一下,后者比前者时间多4倍,所以建议理解前者
*/
// if(i>=z)///保证不重复
sou(x-i,y-1,i);///又多分解一份
///所以继续搜索x=剩下数值减去当前的这份的数值
///y-=1,z=当前枚举到的i
}
}
int main()
{
cin>>n>>k;
sou(n,k,1);
cout<<gs;
return 0;
}