#include <bits/stdc++.h>
using namespace std;using ll=long long;using uint=unsigned int;using pii=pair<int,int>;using pll=pair<ll,ll>;using ull = unsigned long long;using ld=long double;template<typename T>void _(const char*s,T h){cerr<<s<<" = "<<h<<"\n";}template<typename T,typename...Ts>void _(const char*s,T h,Ts...t){int b=0;while(((b+=*s=='(')-=*s==')')!=0||*s!=',')cerr<<*s++;cerr<<" = "<<h<<",";_(s+1,t...);}// break continue pop_back 998244353
#define int ll
#define pii pll
#define f first
#define s second
#define pb emplace_back
#define forn(i,n) for(int i=0;i<(n);++i)
#define sz(a)((int)(a).size())
#define sqr(x) ((x)*(x))
struct init{init(){cin.tie(0);iostream::sync_with_stdio(0);cout<<fixed<<setprecision(10);cerr<<fixed<<setprecision(5);}~init(){
#ifdef LOCAL
#define dbg(...) _(#__VA_ARGS__,__VA_ARGS__)
cerr<<"Time elapsed: "<<(double)clock()/CLOCKS_PER_SEC<<"s.\n";
#else
#define dbg(...) 
#endif
}}init;template<typename T,typename U>void upx(T&x,U y){if(x<y)x=y;}template<typename T,typename U>void upn(T&x,U y){if(x>y)x=y;}mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());const int D=4,dx[]={+1,0,-1,0},dy[]={0,+1,0,-1};
const int N=2e5+5,A=10,M=1e9+7;
void ad(int32_t &x,int32_t y){
    if((x+=y)>=M)x-=M;
}
struct ak{
    struct node{
        int32_t go[A];
        int32_t ju[A];
        int32_t up,kak,link;
        int32_t te,dp,ndp;//<--
        node(){
            memset(go,0,sizeof go);
            memset(ju,0,sizeof ju);
            up=1;kak=0;link=0;te=0;dp=0;ndp=0;
        }
    }t[N];
    int f=2;
    void add(vector<int>s){
        int v=1;
        for(int c:s){
            c--;
            // c-='0';//<-- MIN CHAR
            if(!t[v].go[c]){
                t[v].go[c]=f;
                t[f].up=v;
                t[f].kak=c;
                f++;
            }
            v=t[v].go[c];
        }
        t[v].te=1;
        // t[v].te|=1<<i;//<--
    }
    int ju(int v,int x){
        if(!t[v].ju[x]){
            if(t[v].go[x])t[v].ju[x]=t[v].go[x];
            else if(v==1)t[v].ju[x]=1;
            else t[v].ju[x]=ju(link(v),x);
        }
        return t[v].ju[x];
    }
    int link(int v){
        if(!t[v].link){
            if(v==1||t[v].up==1)t[v].link=1;
            else t[v].link=ju(link(t[v].up),t[v].kak);
        }
        return t[v].link;
    }
    void zk(){//после добавления всех строк все дп считать здесь
        vector<int>q(f-1);
        int l=0,r=0;
        q[r++]=1;
        while(l<r){
            int v=q[l++];
            if(t[v].up==1)t[v].link=1;
            else t[v].link=t[t[t[v].up].link].ju[t[v].kak];
            forn(x,A){
                if(t[v].go[x])t[v].ju[x]=t[v].go[x];
                else if(v==1)t[v].ju[x]=1;
                else t[v].ju[x]=t[t[v].link].ju[x];
            }
            t[v].te|=t[t[v].link].te;
            forn(x,A)if(t[v].go[x])q[r++]=t[v].go[x];
        }
    }
    void redp(){
        forn(i,f)t[i].ndp=0;
        vector<int>q(f-1);
        int l=0,r=0;
        q[r++]=1;
        while(l<r){
            int v=q[l++];
            forn(x,A){
                int to=t[v].ju[x];
                if(!t[to].te){
                    ad(t[to].ndp,t[v].dp);
                }
            }
            forn(x,A)if(t[v].go[x])q[r++]=t[v].go[x];
        }
        forn(i,f)t[i].dp=t[i].ndp;
    }
    int get(){
        int ans=0;
        forn(i,f)ans+=t[i].dp;
        return ans%M;
    }
}ak;

vector<vector<int>> bad[3];
vector<int> cur;
void gen(int n,int s){
    if(n==0){
        bad[s].pb(cur);
    }else{
        for(int i=1;i<=n;++i){
            cur.pb(i);
            gen(n-i,s);
            cur.pop_back();
        }
    }
}

int32_t main(){
    int n;
    int x[3];
    cin>>n;
    forn(i,3){
        cin>>x[i];
        gen(x[i],i);
    }
    vector<int> s;
    for(auto v0:bad[0]){
        s=v0;
        for(auto v1:bad[1]){
            for(int i:v1)s.pb(i);
            for(auto v2:bad[2]){
                for(int i:v2)s.pb(i);
                ak.add(s);
                // cerr<<"s: ";for(int i:s)cerr<<i<<' ';cerr<<'\n';
                for(int i:v2)s.pop_back();
            }
            for(int i:v1)s.pop_back();
        }
    }
    ak.zk();
    ak.t[1].dp=1;
    int pw=1;
    forn(i,n){
        (pw*=10)%=M;
        ak.redp();
    }
    int ans=ak.get();
    dbg(pw,ans);
    cout<<(pw-ans+M)%M<<'\n';
    return 0;
}

Measured memory_bytes: 24180