Problem: Niwango bought a piece of land that can be represented as a half-open interval [0, X).

Niwango will lay out N vinyl sheets on this land. The sheets are numbered 1,2, \ldots, N, and they are distinguishable. For Sheet i, he can choose an integer j such that 0 \leq j \leq X - L_i and cover [j, j + L_i) with this sheet.

Find the number of ways to cover the land with the sheets such that no point in [0, X) remains uncovered, modulo (10^9+7). We consider two ways to cover the land different if and only if there is an integer i (1 \leq i \leq N) such that the region covered by Sheet i is different.

Constraints

* 1 \leq N \leq 100
* 1 \leq L_i \leq X \leq 500
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N X
L_1 L_2 \ldots L_N


Output

Print the answer.

Examples

Input

3 3
1 1 2


Output

10


Input

18 477
324 31 27 227 9 21 41 29 50 34 2 362 92 11 13 17 183 119


Output

134796357

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define mp make_pair
#define PI pair<ll,ll>
#define poly vector<ll>
#define mem(a) memset((a),0,sizeof(a))
#define For(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define Rep(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline ll read(){
	ll x = 0; char ch = gc(); bool positive = 1;
	for (; !isdigit(ch); ch = gc())	if (ch == '-')	positive = 0;
	for (; isdigit(ch); ch = gc())	x = x * 10 + ch - '0';
	return positive ? x : -x;
}
inline void write(ll a){
    if(a<0){
    	a=-a; putchar('-');
	}
    if(a>=10)write(a/10);
    putchar('0'+a%10);
}
inline void writeln(ll a){write(a); puts("");}
inline void wri(ll a){write(a); putchar(' ');}
ll rnd(){
	ull ans=0;
	For(i,0,4)ans=ans<<15^rand();
	return ans%((ull)1<<63);
}
const int N=505,mod=1e9+7;
const ll mod2=(ll)mod*mod*7;
int n,x,to[N];
ll dp[N][N],ni[N],fac[N];
void add(ll &a,ll b){
	a+=b; if(a>=mod2)a-=mod2;
}
ll ksm(ll a,int b){
	int ans=1;
	for(;b;b>>=1){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
	}
	return ans;
}
int main(){
	#ifdef Brollan
		freopen("1.in","r",stdin);
	#endif
	n=read(); x=read()+1;
	For(i,fac[0]=1,x)fac[i]=fac[i-1]*i%mod;
	ni[x]=ksm(fac[x],mod-2);
	Rep(i,x,1)ni[i-1]=ni[i]*i%mod;
	For(i,1,n)to[read()]++;
	dp[0][0]=1;
	Rep(i,x,1){
		Rep(j,x,0)Rep(o,j,0)if(dp[j][o]){
			dp[j][o]%=mod;
			For(k,1,to[i])dp[j][o]=dp[j][o]*(j-o*i)%mod;
			//cout<<i<<" "<<j<<" "<<o<<" "<<dp[j][o]<<endl;
			for(int k=1;j+i*k<=x;k++){
				add(dp[j+i*k][o+k],ni[k]*dp[j][o]);
			}
		}
	}
	ll ans=0;
	For(i,0,x){
		//cout<<dp[x][i]*fac[i]%mod<<endl;
		ll t=dp[x][i]%mod*fac[i]%mod;
		ans=(ans+(i%2?t:mod-t))%mod;
	}
	cout<<ans<<endl;
}