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>

#define mp make_pair
#define X first
#define Y second
#define FOE(x, a) for(auto x : a)
#define FOR(i, a, b) for(int i = a; i <= b; i++)
#define FOD(i, a, b) for(int i = a; i >= b; i--)

using namespace std;

typedef long long ll;
typedef pair <int, int> ii;

const int N = 101;
const int X = 510;
const int MOD = 1e9 + 7;

int n, x, d[X];
int F[X][X][X], C[X][X];

void add(int &x, int y){
    x += y;
    x -= (x >= MOD) * MOD;
}

void sub(int &x, int y){
    x -= y;
    x += (x < 0) * MOD;
}

int powMod(int n, int k){
    assert(n >= 0);
    if (k == 0)
        return 1;
    int res = powMod(n, k >> 1);
    res = (ll) res * res % MOD;
    if (k & 1)
        res = (ll) res * n % MOD;
    return res;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> x;
    FOR(i, 1, n){
        int l;
        cin >> l;
        d[l]++;
    }

    FOR(i, 0, x){
        C[i][0] = 1;
        FOR(j, 1, i){
            add(C[i][j], C[i - 1][j]);
            add(C[i][j], C[i - 1][j - 1]);
        }
    }

    F[x + 1][0][0] = 1;
    FOD(i, x + 1, 1)
        FOR(j, 0, x)
            FOR(s, j * i, x)
                FOR(k, 0, x - j){
                    if (s + k * (i - 1) > x)
                        break;
                    add(F[i - 1][j + k][s + k * (i - 1)], (ll) F[i][j][s] * C[j + k][k] % MOD * powMod(s - (i - 2) * j + k, d[i - 1]) % MOD);
                }

    int ans = 0;
    FOR(i, 0, x - 1){
        int val = F[0][i + 1][x - i];
        if (i & 1)
            sub(ans, val);
        else
            add(ans, val);
    }

    cout << ans;

    return 0;
}