Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: theem1502

Problemset: กองไฟ

Language: cpp

Time: 0.010 second

Submitted On: 2026-02-22 12:20:02

#include <bits/stdc++.h>
using namespace std;
int num;
int dp[51][51][51][3][3];

vector<int> check(3);
const int mod = 1e9 + 7;
int recursion(vector<int> &check, int forbidden, int first, vector<int> &realcheck) {

   int currentx = realcheck[0] - check[0] + realcheck[1] + realcheck[2] - check[1] - check[2];
  //     cout << "curr " << currentx << " " << forbidden << "\n";
    int sum = 0;
    if (currentx == num) {
          //  cout << "no";
        return 1;
    }
    if (currentx == num -1) {
        for (int i = 0; i < 3; i ++) {
            if (i == first || i == forbidden || check[i] <= 0) {
                continue;
            }
            check[i]--;
            sum += recursion(check, i, first, realcheck) % mod;
            check[i]++;
        }

        return sum % mod;
    }

    if (dp[check[0]][check[1]][check[2]][forbidden][first] != -1) {
        return dp[check[0]][check[1]][check[2]][forbidden][first] % mod;

    }


    /*
    if (forbidden == 1) {
        sum += recursion();
    }
    if (forbidden == 2) {
        sum += recursion() + recursion();a
    }
    if (forbidden == 3) {
        sum += recursion() + recursion();
}
*/
    if (currentx == 0) {
     //   cout << "yes";
              for (int i = 0; i < 3; i++) {

            if (forbidden == i || check[i] <= 0) {
            continue;
            }
               check[i]--;
            sum += recursion(check, i, i, realcheck) % mod;
   check[i]++;
        }
        return dp[check[0]][check[1]][check[2]][forbidden][first] = sum % mod;
    }

        for (int i = 0; i < 3; i++) {

            if (forbidden == i || check[i] <= 0) {
            continue;
            }
               check[i]--;
            sum += recursion(check, i, first, realcheck);
   check[i]++;
        }
        return dp[check[0]][check[1]][check[2]][forbidden][first] = sum % mod;



}

int main() {
    memset(dp, -1, sizeof(dp));
    cin >> num >> check[0] >> check[1] >> check[2];
    vector<int> another = check;
    cout << recursion(check, -1,-1, another) % mod;

}