Submission

Status:

(PPPPPPPPPP)(PPPPP)(PPPPP)(PPPPPPPPPP)

Subtask/Task Score:

{20/20}{30/30}{30/30}{20/20}

Score: 100

User: SnowAveNode

Problemset: กองไฟ

Language: python

Time: 0.693 second

Submitted On: 2026-04-22 19:06:44

import sys
input=sys.stdin.readline
MOD = 10**9+7

n=int(input())
na,nb,nc=map(int,input().split())
hf=n//2
if na>hf or nb>hf or nc>hf:
    print(0)
    exit()

dp = [[[[[0]*3 for _ in range(3)] for _ in range(55)] for _ in range(55)] for _ in range(2)]

dp[0][1][0][0][0] = 1
dp[0][0][1][1][1] = 1
dp[0][0][0][2][2] = 1

for i in range(n-1):
    cur,next= i%2, (i+1)%2
    dp[next] = [[[[0]*3 for _ in range(3)] for _ in range(55)] for _ in range(55)]
    for a in range(na+1):
        for b in range(nb+1):
            c= i+1 -a-b
            if c<0 or c>nc: continue
            for prev in range(3):
                for first in range(3):
                    val = dp[cur][a][b][prev][first]
                    if val==0: continue
                    if a<na and prev!=0: dp[next][a+1][b][0][first] = (dp[next][a+1][b][0][first] + val) % MOD
                    if b<nb and prev!=1: dp[next][a][b+1][1][first] = (dp[next][a][b+1][1][first] + val) % MOD
                    if c<nc and prev!=2: dp[next][a][b][2][first] = (dp[next][a][b][2][first] + val) % MOD

ans = 0
for prev in range(3):
    for first in range(3):
        if prev==first: continue
        last = (n-1)%2
        ans = (ans + dp[last][na][nb][prev][first]) % MOD
print(ans)