#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } const long long INF = 1LL << 60; const long long MOD = 1000000007LL; const long long MAX = 500000LL; using namespace std; typedef unsigned long long ull; typedef long long ll; ll N, S, K; vector> dp; ll dfs(ll n, ll k) { if (k == 1) return 1; if (dp[n][k] != -1) return dp[n][k]; ll res = 0; res += dfs(n, k - 1); res %= MOD; if (n - k >= 0) res += dfs(n - k, k); res %= MOD; return dp[n][k] = res; } int main() { cin >> N >> S >> K; dp = vector>(S + 1, vector(N + 1, -1)); ll sum = 0; for (ll i = 0; i < N; i++) { S -= i * K; } if (S < 0) { cout << "0" << endl; return 0; } cout << dfs(S, N) << endl; return 0; }