#include<bits/stdc++.h> usingnamespacestd; constint maxn = 50, mod = 1e9 + 7; int n, m, f[maxn + 10][maxn + 10][maxn * maxn + 10], comb[maxn + 10][maxn + 10]; int a[maxn + 10], ans, minv[maxn + 10];
inlinevoidaddto(int &x, int y){ x += y; if (x >= mod) x -= mod; } inlineintmul(int x, int y){ return1ll * x * y % mod; }
intmain(){ scanf("%d%d", &n, &m); for (int i = 0; i <= n; ++i) { comb[i][0] = 1; for (int j = 1; j <= i; ++j) { addto(comb[i][j], comb[i - 1][j]); addto(comb[i][j], comb[i - 1][j - 1]); } } for (int i = 1; i <= m; ++i) scanf("%d", &a[i]); sort(a + 1, a + m + 1); for (int i = 1; i <= m; ++i) a[i] += a[i - 1]; for (int i = 0; i <= n; ++i) { minv[i] = 1e9; for (int j = 0; j <= m; ++j) minv[i] = min(minv[i], a[j] + (n - i) * (m - j)); } f[0][0][0] = 1; for (int i = 0; i <= m; ++i) for (int j = 0; j <= n; ++j) for (int k = 0; k <= n * m; ++k) if (f[i][j][k]) { int sum = k; for (int l = j; l <= n; ++l) { if (sum + minv[l] < a[m]) break; addto(f[i + 1][l][sum], mul(f[i][j][k], comb[l][j])); sum += i; } } printf("%d", f[m + 1][n][a[m]]); }