#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define REP(i, n) for(int i = 0; i < (int)(n); ++i)
#define FOR(i, m, n) for(int i = (int)(m); i < (int)(n); ++i)

const int MOD = 1e+9 + 7;

int main()
{
    int N, X, Y, Z;
    cin >> N >> X >> Y >> Z;

    long long ans = 1;
    REP(i, N) ans = ans*10 % MOD;

    int S = (1<<(X+Y+Z))-1;  // X+Y+Z-1 個前までの状態を保持しておけば十分
	int C = (1<<(Z-1))|(1<<(Y+Z-1))|(1<<(X+Y+Z-1));

    // dp[i][j]: i-1まで見たとき、直前が j で XYZ を含まない数列の数
    vector<vector<long long>> dp(N+1, vector<long long>((1<<(X+Y+Z))+1));
	dp[0][0] = 1;
    FOR(i, 1, N+1){
        REP(s, S+1){ // s: 直前の状態
            if(dp[i-1][s] == 0) continue; 
            FOR(j, 1, 11){  // i 番目が j のとき
                int sn = (s<<j)|(1<<(j-1));
                sn &= S;  // sn の bit 桁数を S 未満にする
                if((sn&C) != C){
                    dp[i][sn] += dp[i-1][s];
                    dp[i][sn] %= MOD;
                }
            }
        }
    }

    REP(i, S+1) ans = (ans-dp[N][i]) % MOD;
    cout << (ans+MOD)%MOD << endl;


    return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
#define N 4000011
const int p=1e9+7;
int n,k,dp[2002][2002],inv[N],f[N],finv[N];
inline int C(int nn,int mm)
{
	if(mm==nn||mm==0)return 1;if(nn<mm)return 0;
	return 1ll*f[nn]*finv[mm]%p*finv[nn-mm]%p;
}
int main()
{
	f[1]=finv[1]=inv[1]=1;
	for(int i=2;i<=4000000;i++)
	{
		inv[i]=1ll*(p-p/i)*inv[p%i]%p;
		f[i]=1ll*f[i-1]*i%p;finv[i]=1ll*finv[i-1]*inv[i]%p;
	}
	scanf("%d%d",&n,&k);
	if(k==1){puts("1");return 0;}
	dp[0][0]=1;
	for(int i=1;i<=n;i++)for(int j=0;j<=i;j++)
	{
		dp[i][j]=dp[i-1][j];
		if(j)(dp[i][j]+=1ll*C(n-i+(n-j+1)*(k-1)-1,k-2)*dp[i][j-1]%p)%=p;
	}
	printf("%d\n",1ll*dp[n][n]*f[n]%p);
}
