Problem:
Score : 700 points

Problem Statement

Haiku is a short form of Japanese poetry. A Haiku consists of three phrases with 5, 7 and 5 syllables, in this order.

Iroha is looking for X,Y,Z-Haiku (defined below) in integer sequences.

Consider all integer sequences of length N whose elements are between 1 and 10, inclusive. Out of those 10^N sequences, how many contain an X,Y,Z-Haiku?

Here, an integer sequence a_0, a_1, ..., a_{N-1} is said to contain an X,Y,Z-Haiku if and only if there exist four indices x, y, z, w (0 ≦ x < y < z < w ≦ N) such that all of the following are satisfied:

a_x + a_{x+1} + ... + a_{y-1} = X

a_y + a_{y+1} + ... + a_{z-1} = Y

a_z + a_{z+1} + ... + a_{w-1} = Z

Since the answer can be extremely large, print the number modulo 10^9+7.

Constraints

3 ≦ N ≦ 40

1 ≦ X ≦ 5

1 ≦ Y ≦ 7

1 ≦ Z ≦ 5

Input

The input is given from Standard Input in the following format:

N X Y Z

Output

Print the number of the sequences that contain an X,Y,Z-Haiku, modulo 10^9+7.

Sample Input 1

3 5 7 5

Sample Output 1

1

Here, the only sequence that contains a 5,7,5-Haiku is [5, 7, 5].

Sample Input 2

4 5 7 5

Sample Output 2

34

Sample Input 3

37 4 2 3

Sample Output 3

863912418

Sample Input 4

40 5 7 5

Sample Output 4

562805100

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;

const int N = 45;
const int md = 1e9 + 7;

int n, X, Y, Z;
vector<int> G[1 << 17];
int f[N][1 << 17][2];

bool has(int mask, int bit) { return (mask & (1 << (bit - 1))); }

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n >> X >> Y >> Z;
	for (int mask = 0; mask < (1 << 17); ++mask) {
		vector<int> pref;
		pref.push_back(0);
		for (int i = 0; i < 17; ++i) if (mask & (1 << i)) pref.push_back(i + 1);
		for (int nxt = 1; nxt < 11; ++nxt) {
			int nmask = 0;
			for (int i : pref) {
				int j = i + nxt;
				if (j <= 17) nmask |= (1 << (j - 1));
			}
			G[mask].push_back(nmask);
		}
	}

	f[0][0][0] = 1;
	for (int i = 1; i <= n; ++i) {
		for (int mask = 0; mask < (1 << 17); ++mask) for (int ok = 0; ok < 2; ++ok) {
			if (!f[i-1][mask][ok]) continue;
			for (auto nmask : G[mask]) {
				int nok = ok;
				if (has(nmask, Z) && has(nmask, Z + Y) && has(nmask, Z + Y + X)) nok = 1;
				f[i][nmask][nok] = (f[i][nmask][nok] + f[i-1][mask][ok]) % md;
			}
		}
	}

	int ans = 0;
	for (int mask = 0; mask < (1 << 17); ++mask) {
		ans = (ans + f[n][mask][1]) % md;
	}
	cout << ans << '\n';
}