题目
题解

Code

s [ i ] [ j ] [ k ] = f [ i ] [ j ] [ k ] s[i][j][k]=\sum f[i][j][k] 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]]);
}