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)