#include #include #include using namespace std; #define MAX 102 int n; int k; int d; #define MOD 1000000007 long long int p[MAX]; class Combination{ long long int ppow(long long int i, long long int j){ long long int res = 1LL; while (j){ if ((j & 1LL)){ res *= i; if (res >= MOD){ res %= MOD; } } j >>= 1; i *= i; if (i >= MOD){ i %= MOD; } } return res; } public: vector k; vector r; void resize(int N){ k.resize(N + 2); r.resize(N + 2); k[0] = 1; for (int i = 1; i < k.size(); i++){ k[i] = k[i - 1]; k[i] *= i; if (k[i] >= MOD)k[i] %= MOD; } for (int i = 0; i < r.size(); i++){ r[i] = ppow(k[i], MOD - 2); } } long long int C(int a, int b){ if (a < b)return 0; long long int up = k[a]; long long int dw = r[b] * r[a - b]; dw %= MOD; up *= dw; up %= MOD; return up; } long long int H(int a, int b){ if (a == 0)return 1; if (b == 0)return 1; return C(a + b - 1, b); } } c; int main(){ c.resize(MAX * 2); cin >> n >> k >> d; p[0] = 1; for (int i = 1; i < MAX; i++){ p[i] = p[i - 1]; p[i] *= d; p[i] %= MOD; } int op = 0; while (n >= k){ n -= k - 1; op++; } if (d == 1){ cout << n << endl; return 0; } long long int ans = 0; for (int i = 1; i <= 1; i++){ for (int j = 0; j <= op; j++){ if (n - 1 == 0){ j = op; } long long int w = c.H(n - 1, op-j); w *= p[j]; w %= MOD; w *= n; w %= MOD; ans += w; ans %= MOD; } } printf("%lld\n", ans); return 0; }