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

#define mp make_pair
#define pb push_back

typedef long long ll;
typedef pair<int, int> ii;
typedef pair<ll, ll> l4;


const int maxn = 20;
int x, y, z;
int dp[2][1<<maxn] = {0};
int f = 0;
const int mod = 1e9+7;
inline void add(int &a, int b)
{
  a += b;
  if (a >= mod)
    a %= mod;
}
int n;
int mask;
bool work[1<<maxn] = {0};
int main()
{
  scanf("%d", &n);
  scanf("%d %d %d", &x, &y, &z);
  int bit = ((((1<<x)+1)<<y)+1)<<(z-1);
  mask = (1<<(x+y+z))-1;
  for (int i = 0; i <= mask; ++i)
    {
      work[i] = true;//找出尾数是几时，不成立的情况
      int tmp = i;
      while (tmp)
    {
      if ((tmp&bit)==bit)
        {
          work[i] = false;
          break;
        }
      tmp >>= 1;
    }
    }
  f = 0;
  dp[f][0] = 1;
  for (int i = 0; i < n; ++i)
    {
      f ^= 1;//压缩数组
      memset(dp[f], 0, (mask+1)*sizeof(int));
      for (int j = 0; j <= mask; ++j)
    if (work[j])
      for (int d = 1; d <= 10; ++d)
        {
          int nxt = ((j<<1)|1)<<(d-1);//这是表示我的末尾数字是多少的时候，加和之后的尾数情况
          nxt &= mask;//然后判断末尾的几个数字有没有包括x,y,z，因为前面的肯定是不会包括的，他都是按照不成立时才向前推进
          if (work[nxt])//此时成立说明在位数为当前的时候，尾数是多少是肯定不符合条件的，然后才能加上比他少一位时不成立的个数
        add(dp[f][nxt], dp[f^1][j]);
        }
    }
  int ans = 0;
  for (int i = 0; i <= mask; ++i)
    add(ans, dp[f][i]);
  ll tot = 1;
  for (int i = 0; i < n; ++i)
    tot = tot * 10 % mod;
  tot -= ans;
  tot %= mod;
  if (tot < 0)
    tot += mod;
  ans = tot;
  printf("%d\n", ans);
}
