#include #define MOD 1000000007LL using namespace std; typedef long long ll; typedef pair P; ll fact[100001]; ll fact_inv[100001]; ll twop[5001]; ll extgcd(ll a,ll b,ll& x,ll& y){ ll d=a; if(b!=0LL){ d=extgcd(b,a%b,y,x); y-=(a/b)*x; }else{ x=1; y=0; } return d; } ll mod_inverse(ll a,ll m){ ll x,y; extgcd(a,m,x,y); return (m+x%m)%m; } ll mod_fact(ll n,ll p,ll& e){ e=0; if(n==0)return 1; ll res=mod_fact(n/p,p,e); e+=n/p; if(n/p%2!=0){ return res*(p-fact[n%p])%p; } return res*fact[n%p]%p; } ll mod_comb(ll n,ll k,ll p){ if(n<0 || k<0 || ne2+e3)return 0; return a1*mod_inverse(a2*a3%p,p)%p; } int n,r,g,b; int main(void){ fact[0]=1; for(ll i=1;i<=100000;i++){ fact[i]=fact[i-1]*i%MOD; } fact_inv[0]=1; for(ll i=1;i<=100000;i++){ fact_inv[i]=fact_inv[i-1]*mod_inverse(i,MOD)%MOD; } twop[0]=1; for(int i=1;i<=3000;i++){ twop[i]=twop[i-1]*2LL%MOD; } scanf("%d%d%d%d",&n,&r,&g,&b); ll ans=0; for(int i=0;i<=min(r,g);i++){ if(i*3-1>n)continue; for(int j=0;j<=min(b,r-i);j++){ if((i+j)*3-1>n)continue; for(int k=0;k<=min(g-i,b-j);k++){ int restr=r-i-j; int restb=b-j-k; int restg=g-i-k; if((i+j+k)*3+(restr+restb+restg)*2-1>n)continue; int rest=n-((i+j+k)*3+(restr+restb+restg)*2-1); ll ck=fact[i+j+k+restr+restb+restg]; ck=ck*fact_inv[i+j+k]%MOD; ck=ck*fact_inv[restr+restb+restg]%MOD; ll cb=fact[i+j+k]; cb=cb*fact_inv[i]%MOD; cb=cb*fact_inv[j]%MOD; cb=cb*fact_inv[k]%MOD; ll ci=fact[restr+restb+restg]; ci=ci*fact_inv[restr]%MOD; ci=ci*fact_inv[restb]%MOD; ci=ci*fact_inv[restg]%MOD; ck=ck*cb%MOD; ck=ck*ci%MOD; ck=ck*twop[i+j+k]%MOD; ck=ck*mod_comb(rest+i+j+k+restr+restg+restb,rest,MOD)%MOD; ans=(ans+ck)%MOD; } } } printf("%lld\n",ans); return 0; }