const int MOD = 1000000007; int comb[76][76]; int d[26][26][76]; int e[26][76][26]; class CubeBuilding { public: int getCount(int R, int G, int B, int N) { comb[0][0] = 1; for (int i = 1; i <= 75; ++i) { comb[i][0] = comb[i][i] = 1; for (int j = 1; j < i; ++j) { comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % MOD; } } int m = R + G + B; d[0][0][0] = 1; for (int i = 1; i <= N; ++i) { for (int j = 0; j <= m && j <= 25; ++j) { for (int k = j; k <= j * i && k <= m; ++k) { for (int p = 0; p <= j && p <= k; ++p) { d[i][j][k] = (d[i][j][k] + d[i - 1][j][k - p]) % MOD; } for (int p = j - 1; p >= 0; --p) { d[i][j][k] = (d[i][j][k] + d[i - 1][p][k - j]) % MOD; } } } } e[0][0][0] = 1; for (int i = 1; i <= N; ++i) { for (int j = 0; j <= m; ++j) { for (int k = 0; k <= m && k <= 25 && k <= j; ++k) { for (int p = 0; p <= j; ++p) { for (int q = 0; q <= k; ++q) { e[i][j][k] = (e[i][j][k] + (long long)e[i - 1][j - p][k - q] * d[N][q][p]) % MOD; } } } } } int ans = 0; for (int p = 1; p <= R; ++p) { long long ccnt = (long long)comb[m - p][G] * comb[m - p - G][B] % MOD; ans = (ans + (long long)e[N][m][p] * ccnt) % MOD; } for (int p = 1; p <= G; ++p) { long long ccnt = (long long)comb[m - p][R] * comb[m - p - R][B] % MOD; ans = (ans + (long long)e[N][m][p] * ccnt) % MOD; } for (int p = 1; p <= B; ++p) { long long ccnt = (long long)comb[m - p][R] * comb[m - p - R][G] % MOD; ans = (ans + (long long)e[N][m][p] * ccnt) % MOD; } return ans; } };