Quite recently a creative student Lesha had a lecture on trees. After the lecture Lesha was inspired and came up with the tree of his own which he called a k-tree.
A k-tree is an infinite rooted tree where:
- each vertex has exactly k children;
- each edge has some weight;
- if we look at the edges that goes from some vertex to its children (exactly k edges), then their weights will equal 1, 2, 3, ..., k.
The picture below shows a part of a 3-tree.
#include <iostream>
#include <stdio.h>#include <string.h>
#define INF 100 + 5
using namespace std;
int num[INF];
int n,k,d;
int sum,ans;
int maxn;
bool flag ;
void fan()
{
//cout<<"maxn"<<maxn<<endl;
//cout<<"sum"<<sum<<endl;
if(sum == n)
{
if(maxn >= d)
ans++;
//cout<<"ans "<<ans<<endl;
return ;
}
for( int i = 0; i< k; i++)
{
if(sum + num[i] <= n)
{
if(maxn < num[i])
maxn = num[i];
sum += num[i];
fan();
// cout<<"num "<<i<<endl;
sum -= num[i];
}
}
return ;
}
int main()
{
scanf("%d %d %d",&n ,&k, &d);
ans = 0;
if( n == 1)
printf("1\n");
else
{
//cout<<n<<endl;
for( int i = 0 ; i< k; i++)
num[i] = i+1;
for( int i = 0; i<k; i++)
{
flag = false;
maxn = num[i];
sum = num[i];
fan();
}
printf("%d\n",ans);
}
return 0;
}