//CF K-Tree
#include <iostream>
using namespace std;
#define MOD 1000000007
long long dp[ 104 ] [ 2 ] ;
int main( )
{
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( NULL ) ;
long n,k,d;
cin >> n>> k>> d;
for ( int i= 0 ; i<= 100 ; i++ )
dp[ i] [ 0 ] = dp[ i] [ 1 ] = 0 ;
dp[ 0 ] [ 0 ] = 1 ;
for ( int s= 1 ; s<= n; s++ )
{
for ( int i= ( s- 1 ) ; i>= ( s- d+ 1 ) && i>= 0 ; i-- )
{
dp[ s] [ 0 ] = ( dp[ s] [ 0 ] + dp[ i] [ 0 ] ) % MOD;
dp[ s] [ 1 ] = ( dp[ s] [ 1 ] + dp[ i] [ 1 ] ) % MOD;
}
for ( int i= ( s- d) ; i>= ( s- k) && i>= 0 ; i-- )
dp[ s] [ 1 ] = ( dp[ s] [ 1 ] + dp[ i] [ 0 ] + dp[ i] [ 1 ] ) % MOD;
}
cout << dp[ n] [ 1 ] ;
}
//You need to change the 'int' dp[104][2] to 'long long' dp[104][2]. This is because the temporary result stored in dp[i][k] is of data type int which overflows and hence wraps around to give negative results and hence wrong answer.
Ly9DRiBLLVRyZWUKI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CmxvbmcgbG9uZyBkcFsxMDRdWzJdOwoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBsb25nIG4sayxkOwogICAgY2luPj5uPj5rPj5kOwogICAgZm9yKGludCBpPTA7IGk8PTEwMDsgaSsrKQogICAgICAgIGRwW2ldWzBdPWRwW2ldWzFdPTA7CiAgICBkcFswXVswXT0xOwogICAgZm9yKGludCBzPTE7IHM8PW47IHMrKykKICAgIHsKICAgICAgICBmb3IoaW50IGk9KHMtMSk7IGk+PShzLWQrMSkgJiYgaT49MDsgaS0tKQogICAgICAgIHsKICAgICAgICAgICAgZHBbc11bMF09KGRwW3NdWzBdK2RwW2ldWzBdKSVNT0Q7CiAgICAgICAgICAgIGRwW3NdWzFdPShkcFtzXVsxXStkcFtpXVsxXSklTU9EOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGk9KHMtZCk7IGk+PShzLWspICYmIGk+PTA7IGktLSkKICAgICAgICAgICAgZHBbc11bMV09KGRwW3NdWzFdK2RwW2ldWzBdK2RwW2ldWzFdKSVNT0Q7CiAgICB9CiAgICBjb3V0PDxkcFtuXVsxXTsKfQoKLy9Zb3UgbmVlZCB0byBjaGFuZ2UgdGhlICdpbnQnIGRwWzEwNF1bMl0gdG8gJ2xvbmcgbG9uZycgZHBbMTA0XVsyXS4gVGhpcyBpcyBiZWNhdXNlIHRoZSB0ZW1wb3JhcnkgcmVzdWx0IHN0b3JlZCBpbiBkcFtpXVtrXSBpcyBvZiBkYXRhIHR5cGUgaW50IHdoaWNoIG92ZXJmbG93cyBhbmQgaGVuY2Ugd3JhcHMgYXJvdW5kIHRvIGdpdmUgbmVnYXRpdmUgcmVzdWx0cyBhbmQgaGVuY2Ugd3JvbmcgYW5zd2VyLg==