#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define int long long #define let const auto #define var auto #define all(c) c.begin(), c.end() #define repeat(i, n) for (int i = 0; i < static_cast(n); i++) #define debug(x) #x << "=" << (x) #ifdef DEBUG #define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl #else #define dump(x) #endif typedef complex point; template vector make_vector1(size_t n){ return vector(n); } template vector make_vector1(size_t n, T ini){ return vector(n, ini); } template vector > make_vector2(size_t n1, size_t n2){ return vector >(n1, make_vector1(n2)); } template vector > make_vector2(size_t n1, size_t n2, T ini){ return vector >(n1, make_vector1(n2, ini)); } template vector > > make_vector3(size_t n1, size_t n2, size_t n3){ return vector > >(n1, make_vector2(n2, n3)); } template vector > > make_vector3(size_t n1, size_t n2, size_t n3, T ini){ return vector > >(n1, make_vector2(n2, n3, ini)); } template ostream &operator<<(ostream &os, const vector &v) { os << "{"; for(auto it = v.begin(); it != v.end(); ++it){ if(it != v.begin()){ os << ","; } os << *it; } return os << "}"; } template void isort(std::vector& v, std::function comp=less()){ sort(v.begin(), v.end(), comp); } template std::vector sort(std::vector v, std::function comp=less()){ isort(v); return v; } template std::vector rmap(const std::vector& v, std::function f){ std::vector t; t.reserve(v.size()); for(const auto& i: v) t.push_back(f(i)); return t; } std::vector split(std::string str, char delim){ std::vector res; size_t current = 0, found; while((found = str.find_first_of(delim, current)) != std::string::npos){ res.push_back(std::string(str, current, found - current)); current = found + 1; } res.push_back(std::string(str, current, str.size() - current)); return res; } string join(const std::vector& v, string delim){ string ret = ""; for(auto it = v.begin(); it != v.end(); ++it){ if(it != v.begin()){ ret += delim; } ret += *it; } return ret; } signed main() { ios::sync_with_stdio(false); cin.tie(0); const long long mod = 1000000007; int n,s,k; cin >> n >> s >> k; auto dp = make_vector1(s+1); dp[0] = 1; for(int i=0; i(s+1); auto add = [&](int i, int v){ if(0 <= i && i < next.size()){ next[i] += v; next[i] %= mod; } }; if(i == 0) { for(int p=0; p*n<=s; p++){ add(p*n, 1); } } else { for(int l=k*(n-i); l<=s; l++){ add(l, dp[l-k*(n-i)]); add(l, next[l-(n-i)]); } } dp.swap(next); } cout << dp.back() << endl; return 0; }