let n, h, d = Scanf.scanf "%d %d %d" (fun x y z -> x, y, z);;

let md = 1000000007L;;
let ( +: ) x y = Int64.add x y;;
let ( -: ) x y = Int64.sub x y;;
let ( *: ) x y = Int64.mul x y;;
let ( +++ ) (x : int) (y : int) : int = Int64.to_int @@ let z = Int64.of_int x +: Int64.of_int y in
                                  if z < md then z else z -: md;;
let ( --- ) (x : int) (y : int) : int = Int64.to_int @@ let z = Int64.of_int x -: Int64.of_int y in
                                  if z >= 0L then z else z +: md;;
let ( *** ) (x : int) (y : int) : int = Int64.to_int @@ Int64.rem (Int64.of_int x *: Int64.of_int y) md;;
      
let f = ref 1 and s = ref 0;;
for i = 1 to n do
  f := !f *** i;
  s := !s +++ !f;
done;;
let f = !f and s = !s;;

let dp = Array.make (h+2) 0;;
dp.(1) <- dp.(1) +++ 1;;
dp.(d+1) <- dp.(d+1) --- 1;;
for i = 1 to h-1 do
  dp.(i+1) <- dp.(i+1) +++ dp.(i);
  let l = i + 1 in
  let r = min (h+1) (i+d+1) in
  dp.(l) <- dp.(l) +++ dp.(i) *** s;
  dp.(r) <- dp.(r) --- dp.(i) *** s;
done;;
let ans = dp.(h) *** f;;
Printf.printf "%d\n" ans;;



