/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static int modulo = 1000000007;
static int tileStackingProblem(int n, int m, int k) {
int dp[][] = new int[n+1][m+1];
int sum[][] = new int[n+1][m+1];
for(int i=0;i<=m;i++){
dp[0][i]=1;
sum[0][i]=1;
}
//If we have n left but m is 0, this means it is not possible to stack any more tile,
//thus setting it to 0
for(int i=0;i<=n;i++){
dp[i][0]=0;
sum[i][0]=1;
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
dp[i][j]=sum[i][j-1];
if(i>k){
dp[i][j] -= sum[i-k-1][j-1];
if (dp[i][j] < 0)
dp[i][j] += modulo;
}
}
for(int i=1;i<=n;i++){
sum[i][j] = sum[i-1][j] + dp[i][j];
sum[i][j] %= modulo;
}
}
return dp[n][m];
}
public static void main
(String[] args
) { Scanner in
= new Scanner
(System.
in); int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
int result = tileStackingProblem(n, m, k);
in.close();
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CgogICAgc3RhdGljIGludCBtb2R1bG8gPSAxMDAwMDAwMDA3OwogICAgCiAgICBzdGF0aWMgaW50IHRpbGVTdGFja2luZ1Byb2JsZW0oaW50IG4sIGludCBtLCBpbnQgaykgewogICAgICAgIGludCBkcFtdW10gPSBuZXcgaW50W24rMV1bbSsxXTsKICAgICAgICBpbnQgc3VtW11bXSA9IG5ldyBpbnRbbisxXVttKzFdOwogICAgICAgIAogICAgICAgIGZvcihpbnQgaT0wO2k8PW07aSsrKXsKICAgICAgICAJZHBbMF1baV09MTsKICAgICAgICAJc3VtWzBdW2ldPTE7CiAgICAgICAgfQogICAgICAgIAkKICAgICAgICAvL0lmIHdlIGhhdmUgbiBsZWZ0IGJ1dCBtIGlzIDAsIHRoaXMgbWVhbnMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHN0YWNrIGFueSBtb3JlIHRpbGUsCiAgICAgICAgLy90aHVzIHNldHRpbmcgaXQgdG8gMAogICAgICAgIGZvcihpbnQgaT0wO2k8PW47aSsrKXsKICAgICAgICAJZHBbaV1bMF09MDsKICAgICAgICAJc3VtW2ldWzBdPTE7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvcihpbnQgaj0xO2o8PW07aisrKXsKICAgICAgICAJZm9yKGludCBpPTE7aTw9bjtpKyspewogICAgICAgIAkJZHBbaV1bal09c3VtW2ldW2otMV07CiAgICAgICAgCQlpZihpPmspewogICAgICAgIAkJCWRwW2ldW2pdIC09IHN1bVtpLWstMV1bai0xXTsKICAgICAgICAgICAgICAgIAkJaWYgKGRwW2ldW2pdIDwgMCkgCiAgICAgICAgICAgICAgICAJCQlkcFtpXVtqXSArPSBtb2R1bG87CiAgICAgICAgCQl9CiAgICAgICAgCX0KICAgICAgICAJCiAgICAgICAgCWZvcihpbnQgaT0xO2k8PW47aSsrKXsKICAgICAgICAJCXN1bVtpXVtqXSA9IHN1bVtpLTFdW2pdICsgZHBbaV1bal07CiAgICAgICAgICAgIAlzdW1baV1bal0gJT0gbW9kdWxvOwogICAgICAgIAl9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkcFtuXVttXTsJCiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgaW4gPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwogICAgICAgIGludCBuID0gaW4ubmV4dEludCgpOwogICAgICAgIGludCBtID0gaW4ubmV4dEludCgpOwogICAgICAgIGludCBrID0gaW4ubmV4dEludCgpOwogICAgICAgIGludCByZXN1bHQgPSB0aWxlU3RhY2tpbmdQcm9ibGVtKG4sIG0sIGspOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOwogICAgICAgIGluLmNsb3NlKCk7CiAgICB9Cn0K