N,R,G,B=map(int,input().split())
mod=10**9+7

FACT=[1]
for i in range(1,2*10**5+1):
    FACT.append(FACT[-1]*i%mod)

FACT_INV=[pow(FACT[-1],mod-2,mod)]
for i in range(2*10**5,0,-1):
    FACT_INV.append(FACT_INV[-1]*i%mod)

FACT_INV.reverse()

def Combi(a,b):
    if 0<=b<=a:
        return FACT[a]*FACT_INV[b]%mod*FACT_INV[a-b]%mod
    else:
        return 0

ANS=0

for x in range(min(R,G),-1,-1):
    for y in range(min(G,B),-1,-1):
        for z in range(min(B,R),-1,-1):
            if x*2+y*2+z*2>N:
                break
            Rrest=R-x-z
            Grest=G-x-y
            Brest=B-y-z

            #print(x,y,z,Rrest,Grest,Brest)

            if Rrest<0 or Grest<0 or Brest<0:
                continue
            need = x+y+z+Rrest+Grest+Brest-1

            #print(x,y,z,Rrest,Grest,Brest,need)

            if x*2+y*2+z*2+Rrest+Grest+Brest+need>N:
                break

            empty=N-x*2-y*2-z*2-Rrest-Grest-Brest-need

            #print("!",x,y,z,Rrest,Grest,Brest,need,empty)

            AX=Combi(x+y+z+Rrest+Grest+Brest,x)*Combi(y+z+Rrest+Grest+Brest,y)*Combi(z+Rrest+Grest+Brest,z)*Combi(Rrest+Grest+Brest,Rrest)*Combi(Grest+Brest,Grest)%mod
            AY=pow(2,x+y+z)%mod
            AZ=Combi(empty+(x+y+z+Rrest+Grest+Brest),empty)

            #print("!?",x,y,z,Rrest,Grest,Brest,need,empty,AX,AY,AZ,AX*AY*AZ%mod)

            ANS=(ANS+AX*AY*AZ)%mod

print(ANS%mod)