// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

#define ll long long

#define ull unsigned long long

//#define db double

#define all(x) x.begin(), x.end()

#define SZ(x) (int)(x.size())

#define mem(x, y) memset(x, y, sizeof(x))

#define what_is(x) cerr <<  "Line " << __LINE__ << ": " << #x << " is " << (x) << endl;

#define suf_zero(x) __builtin_ffs(x)

#define pre_zero(x) __builtin_clz(x)

#define num_one(x) __builtin_popcount(x)

#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }

#define mp make_pair

#define eb emplace_back

#define pb push_back

#define INFI 2000000009

#define INFLL (ll)1e18+7

#define fi first

#define se second

#define lson l, mid, rt<<1

#define rson mid+1, r, rt<<1|1

#define PII pair<int, int>

#define rep(i, begin, end) for(__typeof(end) i =(begin)-((begin)>(end));i!=(end)-((begin)>(end));i+=1-2*((begin)>(end)))

void err(istream_iterator<string> it) {cerr<<endl;}

template<typename T, typename... Args>

void err(istream_iterator<string> it, T a, Args... args) {

    cerr << *it << " = " << a << " , ";

    err(++it, args...);

}

#include<ext/pb_ds/assoc_container.hpp>

#include<ext/pb_ds/tree_policy.hpp>

#include<ext/pb_ds/hash_policy.hpp>

using namespace __gnu_pbds;

//mt19937 rng32(chrono::steady_clock::now().time_since_epoch().count());

//mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());

const int mod = 1e9+7;

ll qp(ll b, ll n, const int mod){ll r=1;b%=mod;if(n<0) n+=mod-1;for(;n;n>>=1, b=b*b%mod)if(n&1) r=r*b%mod;return r;}

//#define RG register

///////////// BOUND /////////////////

//tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> T;

namespace fastIO{

    #define BUF_SIZE 2000000

//     fread -> read

    bool IOerror = 0;

    static char obuf[BUF_SIZE], *OUT=obuf;

    inline char nc(){

        static char buf[BUF_SIZE], *p1 = buf+BUF_SIZE,

         *pend = buf+BUF_SIZE;

         if(p1==pend){

             p1 = buf;

             pend = buf+fread(buf, 1, BUF_SIZE, stdin);

             if(pend==p1){

                 IOerror = 1;

                 return -1;

             }

         }

         return *p1++;

    }

    inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}

    inline int read(int &x){

        char ch;

        while(blank(ch=nc()));

        if(IOerror)return 0;

        for(x=ch-'0';(ch=nc())>='0'&&ch<='9';x=x*10+ch-'0');

        return 1;

    }

    inline int read(ll &x){

        char ch;

        while(blank(ch=nc()));

        if(IOerror)return 0;

        for(x=ch-'0';(ch=nc())>='0'&&ch<='9';x=x*10+ch-'0');

    }

    void print(const int& x) {

        if(x > 9) print(x / 10);

        *OUT++= x % 10 + '0';

    }

    void print(const ll& x) {

        if(x > 9) print(x / 10);

        *OUT++= x % 10 + '0';

    }

    void print(const char*s)

    {

        int len = strlen(s);

        for(int i=0;i<len;++i) *(OUT++) = s[i];

    }

    //void print(const __int128& x){if(x>9)print(x/10);putchar('0'+x%10);}

    void print(){fwrite(obuf, OUT-obuf, 1, stdout);}

    #undef BUF_SIZE

};

using namespace fastIO;

/////////////// MACRO ///////////////

ll dp[42][1<<18];

int main()

{

    int n, a, b, c;scanf("%d%d%d%d", &n, &a, &b, &c);

    const ll goal = ((((1<<a)+1)<<b)+1)<<c-1, sum = a+b+c;

    const ll m = 1<<sum;error(n, a, b, c);

    ll ans = 0;dp[0][0]=1;

    //for(int i=31;i>=0;--i)cout<<((goal>>i)&1);cout<<endl;

    for(int i=1;i<=n+1;++i)

    {

        ans = ans*10%mod;

        for(ll j=0;j<m;++j)

        {

            //error(i, j, dp[i-1][j]);

            if((j&goal)==goal) ans = (ans+dp[i-1][j])%mod;

            else for(int k=1;k<=10;++k)

                (dp[i][(((j<<1)+1)<<(k-1))&(m-1)] += dp[i-1][j]) %=mod;

        }

    }

    cout << ans << endl;

}

// Faster C++ solution for the same problem (measured speedup: 1.8939941757026904x):
#include<bits/stdc++.h>

using namespace std;

const int mod=1000000007;

int f[42][1<<18];

int n,x,y,z,p;

int qp(int x,int k)

{

	int res=1;

	while(k)

	{

		if(k&1)res=1ll*res*x%mod;

		x=1ll*x*x%mod;

		k>>=1;

	}

	return res;

}

int ans,sum;

int main()

{

	scanf("%d%d%d%d",&n,&x,&y,&z);

	p=(1<<z-1)+(1<<y+z-1)+(1<<x+y+z-1);

	f[0][0]=1;

	sum=(1<<x+y+z)-1;

	for(int i=0;i<n;i++)

		for(int j=0;j<=sum;j++)

			if(f[i][j])

				for(int k=1;k<=10;k++)

				{

					int now=(j<<k)|(1<<k-1);

					now&=sum;

					if((now&p)!=p)

						(f[i+1][now]+=f[i][j])%=mod;

				}

	for(int i=0;i<=sum;i++)

		(ans+=f[n][i])%=mod;

	printf("%d\n",(qp(10,n)-ans+mod)%mod);

	return 0;

}