Submission

Status:

(PPPPPPPPPP)(PPPPP)(-SSSS)(SSSSSSSSSS)

Subtask/Task Score:

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

Score: 50

User: kungarooo

Problemset: กองไฟ

Language: cpp

Time: 0.020 second

Submitted On: 2026-03-19 15:24:47

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long int a,b,c,n;
    const long long int N=1e9+7;
    cin>>n>>a>>b>>c;
    if(n==2){
        if(a==2||b==2||c==2)cout<<0;
        else cout<<2;
    }
    //ต้น ปลาย a b c ใช้ถึงไหน
    long long int dp[3][3][n+1][n+1][n+1]={};
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(i==j){
                int a[3]={};
                a[i]=2;
                dp[i][j][a[0]][a[1]][a[2]]=0;
            }else{
                int a[3]={};
                a[i]=1;
                a[j]=1;
                dp[i][j][a[0]][a[1]][a[2]]=1;
            }
        }
    }
    for(int i=3;i<=n;i++){
        for(int j=0;j<i;j++){
            for(int k=0;k<i;k++){
                int l=i-j-k;
                if(l<0)continue;
                if(j-1>=0)dp[0][0][j][k][l]=(dp[0][1][j-1][k][l]+dp[0][2][j-1][k][l])%N;
                if(k-1>=0)dp[0][1][j][k][l]=(dp[0][0][j][k-1][l]+dp[0][2][j][k-1][l])%N;
                if(l-1>=0)dp[0][2][j][k][l]=(dp[0][0][j][k][l-1]+dp[0][1][j][k][l-1])%N;

                if(j-1>=0)dp[1][0][j][k][l]=(dp[1][1][j-1][k][l]+dp[1][2][j-1][k][l])%N;
                if(k-1>=0)dp[1][1][j][k][l]=(dp[1][0][j][k-1][l]+dp[1][2][j][k-1][l])%N;
                if(l-1>=0)dp[1][2][j][k][l]=(dp[1][0][j][k][l-1]+dp[1][1][j][k][l-1])%N;
                
                if(j-1>=0)dp[2][0][j][k][l]=(dp[2][1][j-1][k][l]+dp[2][2][j-1][k][l])%N;
                if(k-1>=0)dp[2][1][j][k][l]=(dp[2][0][j][k-1][l]+dp[2][2][j][k-1][l])%N;
                if(l-1>=0)dp[2][2][j][k][l]=(dp[2][0][j][k][l-1]+dp[2][1][j][k][l-1])%N;        
            }
        }
    }
    cout<<(dp[0][1][a][b][c]+dp[0][2][a][b][c]+dp[1][0][a][b][c]+dp[1][2][a][b][c]+dp[2][0][a][b][c]+dp[2][1][a][b][c])%N;
    return 0;
}