Code
s[i][j][k]=∑f[i][j][k]
#include<bits/stdc++.h>
using namespace std;
const int N=51,M=1e9+7;
int f[N][N][N*N],s[N][N][N*N],a[N],b[N],c[N][N],i,j,n,m,k,x;
int main(){
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++) scanf("%d",&b[i]);
sort(b+1,b+m+1);
for (i=2;i<=m;i++) b[i]+=b[i-1];
for (i=0;i<=n;i++)
for (j=1,c[i][0]=1;j<=i;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%M;
for (i=1;i<=n;i++){
x=1e9;
for (j=0;j<=m;j++) x=min(x,(n-i)*(m-j)+b[j]);
a[i]=b[m]-x;//a[i]最小可以取的值
}
for (i=0;i<=n;i++){
s[i][0][0]=f[i][0][0]=!a[i]?c[n][i]:0;
for (j=1;j<=m;j++) s[i][j][0]=(s[i][j-1][0]+f[i][j][0])%M;
}
for (i=1;i<=n;i++){
for (j=1;j<=m;j++)
for (k=a[i];k<=b[m];k++){
for (x=0;x<i;x++)
if (k-(i-x)*j>=0) f[i][j][k]=(f[i][j][k]+1ll*s[x][j-1][k-(i-x)*j]*c[n-x][i-x]%M)%M;
s[i][j][k]=(s[i][j-1][k]+f[i][j][k])%M;
}
}
printf("%d",s[n][m][b[m]]);
}