#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0; i=b; --i) #define ALL(c) (c).begin(), (c).end() typedef long long ll; typedef vector VI; typedef vector VL; typedef vector VVL; typedef vector VVI; typedef pair P; typedef pair PL; const ll mod = 1000000007; const int N = 3000; ll fact[N], invf[N], tw[N]; ll mul(ll x, ll y){ return (x%mod)*(y%mod)%mod; } ll powll(ll x, ll y){ ll res = 1LL; while(y){ if (y & 1LL) res *= x; res %= mod; x = (x*x) % mod; y >>= 1LL; } return res; } ll divll(ll x, ll y){ return (x * powll(y,mod-2)) % mod; } ll nPr(ll n, ll r){ if (n < r || r < 0) return 0; return mul(fact[n], invf[n-r]); } ll nCr(ll n, ll r){ if (n < r || r < 0) return 0; return mul(mul(fact[n], invf[r]), invf[n-r]); } int main() { fact[0] = invf[0] = tw[0] = 1; FOR(i,1,N-1){ fact[i] = (fact[i-1] * i) % mod; invf[i] = divll(invf[i-1], i); tw[i] = (tw[i-1] * 2) % mod; } ll n, r, g, b; cin >> n >> r >> g >> b; ll sum = r + g + b; ll ans = 0; REP(x,n/3+2){ int y = sum - 2*x; if (y < 0) continue; ll di = (nCr(n-2*x-y+1, x+y) * nCr(x+y, x)) % mod; if (di == 0) continue; ll tmp = 0; REP(rg,x+1) REP(gb,x-rg+1){ int br = x - rg - gb; int rr = r - rg - br; int gg = g - rg - gb; int bb = b - gb - br; if (rr < 0 || gg < 0 || bb < 0) continue; ll saku = ((((((nCr(x, rg) * nCr(x-rg, gb) % mod) * tw[rg]) % mod) * tw[gb]) % mod) * tw[br]) % mod; ll hima = (nCr(y, rr) * nCr(y-rr, gg)) % mod; tmp = (tmp + (saku * hima) % mod) % mod; } // printf("x = %d, y = %d, di = %lld, tmp = %lld\n", x, y, di, tmp); tmp = (tmp * di) % mod; ans = (ans + tmp) % mod; } cout << ans << endl; return 0; }