#include // clang-format off using namespace std;constexpr int INF=1001001001;constexpr long long INFll=1001001001001001001;namespace viewer{using s=string;templates f(T i){s S=i==INF||i==INFll?"inf":to_string(i);return s(max(0,3-int(S.size())),' ')+S;} templateauto v(T&x,s&&e)->decltype(cerr<void v(const pair&p,s&&e="\n"){cerr<<"(";v(p.first,", ");v(p.second,")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),", ");v(get<3>(t),")"+e);} templatevoid v(const vector&vx,s);templateauto ve(int,const vector&vx)->decltype(cerr<auto ve(bool,const vector&vx){cerr<<"{\n";for(const T&x:vx)cerr<<" ",v(x,",");cerr<<"}\n";}templatevoid v(const vector&vx,s){ve(0,vx);} templatevoid v(const deque&q,s&&e){v(vector(q.begin(),q.end()),e);}templatevoid v(const set&S,s&&e){v(vector(S.begin(),S.end()),e);}templatevoid v(const multiset&S,s&&e){v(vector(S.begin(),S.end()),e);}templatevoid v(const unordered_set&S,s&&e){v(vector(S.begin(),S.end()),e);} templatevoid v(const priority_queue&p,s&&e){priority_queueq=p;vectorz;while(!q.empty()){z.push_back(q.top());q.pop();}v(z,e);}templatevoid v(const map&m,s&&e){cerr<<"{"<<(m.empty()?"":"\n");for(const auto&kv:m){cerr<<" [";v(kv.first,"");cerr<<"] : ";v(kv.second,"");cerr<<"\n";}cerr<<"}"+e;} templatevoid _view(int n,s&S,T&var){cerr<<"\033[1;32m"<void grid(T _){}void grid(const vector>&vvb){cerr<<"\n";for(const vector&vb:vvb){for(const bool&b:vb)cerr<<(b?".":"#");cerr<<"\n";}} void _debug(int,s){}templatevoid _debug(int n,s S,const H&h,const T&... t){int i=0,cnt=0;for(;iap;mint re=a;for(long long r=1;r fact_inv, inv; void init_nCk(int SIZE) { fact_inv.resize(SIZE + 5); inv.resize(SIZE + 5); fact_inv[0] = fact_inv[1] = 1; inv[1] = 1; for (int i = 2; i < SIZE + 5; i++) { inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD; fact_inv[i] = fact_inv[i - 1] * inv[i] % MOD; } } long long bign_nCk(long long n, long long k) { if (n < k || n < 0 || k < 0) return 0; long long ans = 1; for (long long i = n; i >= n - k + 1; i--) { ans *= (i % MOD); ans %= MOD; } return ans * fact_inv[k] % MOD; } int main() { cin.tie(0); ios::sync_with_stdio(false); long long L, R; cin >> L >> R; long long A, B, C; cin >> A >> B >> C; if (A + B > C) { init_nCk(5); cerr << "!" << endl; debug(R - L + 1 - A - B + 2); cout << bign_nCk(R - L + 1 - A - B + 2, 3) << endl; return 0; } else { if (R < L + C) { cout << 0 << endl; return 0; } cerr << "?" << endl; // mint ans2 = 0; // for (long long x = L; x <= R - C; x++) { // for (long long z = x + C; z <= R; z++) { // assert(z - x - A - B + 1 >= 0); // ans2 += mint(z - x - A - B + 1); // } // } long long D = A + B - 1; mint ans = (mint(1) / 6) * mint(mint(C) * C + mint(C) * (mint(2) * L - mint(2) * R - 3) + mint(L) * L - mint(L) * (mint(2) * R + 3) + mint(R) * R + mint(3) * R + 2) * (mint(2) * C - mint(3) * D - L + R); debug(ans); // assert(ans.val() % MOD == ans2.val() % MOD); cout << ans.val() % MOD << endl; } return 0; }