#include using namespace std; typedef long long LL; typedef pair PII; // chmax, chmin 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; } template function op_max = [](T a, T b) -> T { return max(a, b); }; template function op_min = [](T a, T b) -> T { return min(a, b); }; template function op_sum = [](T a, T b) -> T { return a + b; }; namespace detail { template struct vector_builder { using type = std::vector::type>; static type make(std::vector dims, const T& v = {}) { const auto vec = std::vector(dims.empty() ? 0 : dims.back(), v); if (!dims.empty()) dims.pop_back(); return vector_builder, NDIMS - 1>::make(dims, vec); } }; template struct vector_builder { using type = std::vector; static type make(std::vector dims, const T& v = {}) { return type(dims.empty() ? 0 : dims.back(), v); } }; } // namespace detail template auto exvector(const T& v, SIZE_T... dims) { static_assert(sizeof...(dims) != 0, "invalid dimension"); std::vector vec_dims{dims...}; return detail::vector_builder::make(vec_dims, v); } using namespace std; //******************** dumps ************************// template void dump(const T& data, vector& iter) { cout << data << " "; } template void dump(const vector& data, vector& iter) { for (auto elem : data) dump(elem, iter); cout << endl; } template void dump(const vector>& data, vector& iter) { for (auto elem : iter) { cout << "[" << elem << "]"; } cout << endl; for (int i = 0; i < data.size(); i++) { iter.push_back(i); dump(data[i], iter); iter.pop_back(); } cout << endl; } template void dump(const vector& data, int dummy) { for (int i = 0; i < data.size(); i++) { cout << "[" << i << "] " << data[i] << endl; } } template void dump(const T& data) { // T : data, U = base type val. vector iter; dump(data, iter); } /////////////////////////////////////////////// long long mul(long long a, long long b, const long long MOD) { return b ? (mul(a * 2, b / 2, MOD) + (b & 1 ? a : 0)) % MOD : 0; } long long bpow(long long a, long long b, const long long MOD) { return (b ? bpow(a * a % MOD, b / 2, MOD) * (b & 1 ? a : 1) : 1) % MOD; } long long inv(long long a, const long long MOD) { return bpow(a, MOD - 2, MOD); } vector MODS = {1000000007}; template class mint { public: long long v; mint() : v(0) {} mint(long long v) : v((v % MODS[kind] + MODS[kind]) % MODS[kind]) {} long long get_mod() { return MODS[kind]; } long long get_val() { return v; } }; template ostream& operator<<(ostream& os, const mint& x) { return os << x.v; } template mint& operator+=(mint& a, mint b) { return a = a.v + b.v; } template mint& operator-=(mint& a, mint b) { return a = a.v - b.v; } template mint& operator*=(mint& a, mint b) { return a = a.v * b.v; } template mint& operator/=(mint& a, mint b) { return a = a.v * inv(b.v, a.get_mod()); } template mint operator+(mint a, mint b) { return a += b; } template mint operator-(mint a, mint b) { return a -= b; } template mint operator*(mint a, mint b) { return a *= b; } template mint operator/(mint a, mint b) { return a /= b; } template mint& operator+=(mint& a, long long b) { return a = a.v + b; } template mint& operator-=(mint& a, long long b) { return a = a.v - b; } template mint& operator*=(mint& a, long long b) { return a = a.v * b; } template mint& operator/=(mint& a, long long b) { return a = a.v * inv(b, a.get_mod()); } template mint operator+(mint a, long long b) { return a += b; } template mint operator-(mint a, long long b) { return a -= b; } template mint operator*(mint a, long long b) { return a *= b; } template mint operator/(mint a, long long b) { return a /= b; } vector> kaijo; void init() { kaijo.push_back(mint<>(1)); for (int i = 1; i <= 2000000; i++) { kaijo.push_back(kaijo.back() * i); } } mint<> comb(LL N, LL K) { if (K < 0) return mint<>(0); if (K > N) return mint<>(0); return kaijo[N] / kaijo[N - K] / kaijo[K]; } int main() { init(); mint<> ans; LL N, M, d1, d2; cin >> N >> M >> d1 >> d2; LL B = M - 1 - d1 * (N - 1); LL K = d2 - d1; for (LL i = 0; i <= N - 1; i++) { mint<> tmp = comb(N - 1, i) * comb(B - (K + 1) * i + N, N); if (i % 2 == 1) tmp = mint<>(0) - tmp; ans += tmp; } cout << ans << endl; return 0; }