#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;
typedef long long ll;
#define N_MAX 200002
const ll MOD = 1000000007;

ll inv[N_MAX],fac[N_MAX],finv[N_MAX];

void init(){
    fac[0]=fac[1]=1;
    finv[0]=finv[1]=1;
    inv[1]=1;
    for(int i=2;i<N_MAX;i++){
        inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;
        fac[i]=fac[i-1]*(ll) i%MOD;
        finv[i]=finv[i-1]*inv[i]%MOD;
    }
}

ll inv_(ll n){
    if(n == 1) return 1;
    else return MOD-inv_(MOD%n)*(MOD/n)%MOD;
}

ll comb(ll n, ll r){
  ll ans;
  if(n < r){
      ans = 0;
  }else{
      ans = (fac[n]*finv[r])%MOD;
      ans = (ans*finv[n-r])%MOD;
      ans = (ans+MOD)%MOD;
  }
  return ans;
}

ll dp[21][1001];
int N, K;
ll a[1001];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << setprecision(10) << fixed;
    init();
    cin >> N >> K;
    for(int i = 0; i < K; i++) cin >> a[i+1];
    dp[0][0] = 1;
    for(int i = 0; i <= K; i++){
        for(int j = 0; j <= N; j++){
            // cout << dp[i][j] << ' ';
            for(int k = j; k <= N; k++){
                int rem = k-j;
                if(rem > a[i+1]) continue;
                
                ll c1 = comb(N-j, rem);
                ll c2 = comb(N-rem, a[i+1]-rem);
                dp[i+1][k] += (((dp[i][j]*c1)%MOD)*c2)%MOD;
                dp[i+1][k] %= MOD;
            }
        }
        // cout << endl;
    }
    cout << dp[K][N] << endl;
}