#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000,100000000000")
using namespace std;
const double eps = 1E-9;
const double Exp = 2.718281828459045;
const double Pi = 3.1415926535897932;
const int NMAX = 100 + 5;
const int MMAX = 100000 + 5;
const int INF = 1000000000;
const int BS = 1000000007;
template <typename T>
inline T abs(const T a) {
  if (a < 0) return -a;
  return a;
}
template <typename T>
inline T sqr(const T& a) {
  return a * a;
}
int a[NMAX][NMAX];
int b[NMAX][NMAX];
int c[NMAX][NMAX];
void mult(int n, int m, int k) {
  int i, j, t;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= k; j++) {
      c[i][j] = 0;
      for (t = 1; t <= m; t++) {
        c[i][j] = (c[i][j] + a[i][t] * 1ll * b[t][j]) % BS;
      }
    }
  }
}
const int BORD = 102;
void pw(int p) {
  int i, j;
  if (0 == p) {
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        c[i][j] = (i == j);
      }
    }
    return;
  }
  if (1 == p) {
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        c[i][j] = a[i][j];
      }
    }
    return;
  }
  if (p & 1) {
    int buf[NMAX][NMAX];
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        buf[i][j] = a[i][j];
      }
    }
    pw(p - 1);
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        a[i][j] = buf[i][j];
      }
    }
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        b[i][j] = c[i][j];
      }
    }
    mult(BORD, BORD, BORD);
  } else {
    pw(p / 2);
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        a[i][j] = c[i][j];
      }
    }
    for (i = 1; i <= BORD; i++) {
      for (j = 1; j <= BORD; j++) {
        b[i][j] = c[i][j];
      }
    }
    mult(BORD, BORD, BORD);
  }
}
int main() {
  ios::sync_with_stdio(false);
  int n, x;
  int d[NMAX] = {0};
  int i, j, y;
  cin >> n >> x;
  for (i = 1; i <= n; i++) {
    cin >> y;
    d[y]++;
  }
  int beg[NMAX];
  beg[0] = 1;
  for (i = 1; i <= 100; i++) {
    beg[i] = 1;
    for (j = 1; j <= i; j++) {
      beg[i] = (beg[i] + beg[i - j] * 1ll * d[j]) % BS;
    }
  }
  memset(a, 0, sizeof(a));
  a[1][1] = 1;
  for (i = 2; i <= BORD; i++) {
    for (j = 2; j <= BORD; j++) {
      if (i == j + 1)
        a[i][j] = 1;
      else
        a[i][j] = 0;
    }
  }
  a[1][BORD] = 1;
  for (i = 2; i <= BORD; i++) {
    a[i][BORD] = d[BORD - i + 1];
  }
  pw(x);
  for (i = 1; i <= BORD; i++) {
    for (j = 1; j <= BORD; j++) {
      b[i][j] = c[i][j];
    }
  }
  a[1][1] = 1;
  for (j = 2; j <= BORD; j++) {
    a[1][j] = beg[j - 2];
  }
  mult(1, BORD, BORD);
  cout << c[1][2] << endl;
  return 0;
}
