#include <bits/stdc++.h>
using namespace std;
struct Matrix {
 private:
  int _r, _c;
  long long int _mod = 1000000007LL;
  vector<vector<long long int> > M;

 public:
  Matrix(int r, int c) {
    _r = r;
    _c = c;
    M.resize(r);
    for (int i = 0; i < r; i++) {
      M[i].resize(c);
    }
  }
  void set(int r, int c, long long int val) { M[r][c] = val; }
  long long int get(int r, int c) { return M[r][c]; }
  void setMod(long long int mod) { _mod = mod; }
  int rsize() { return _r; }
  int csize() { return _c; }
  Matrix iden(int x) {
    Matrix res(x, x);
    for (int i = 0; i < x; i++) {
      res.set(i, i, 1);
    }
    return res;
  }
  Matrix operator+(Matrix a) {
    Matrix res(_r, _c);
    int i, j;
    for (i = 0; i < _r; i++) {
      for (j = 0; j < _c; j++) {
        res.set(i, j, (M[i][j] + a.get(i, j)) % _mod);
      }
    }
    return res;
  }
  void operator+=(Matrix a) {
    Matrix res(_r, _c);
    int i, j;
    for (i = 0; i < _r; i++) {
      for (j = 0; j < _c; j++) {
        M[i][j] = (M[i][j] + a.get(i, j)) % _mod;
      }
    }
  }
  Matrix operator*(Matrix a) {
    Matrix res(_r, a.csize());
    int i, j, k;
    long long int tmp;
    for (i = 0; i < _r; i++) {
      for (j = 0; j < a.csize(); j++) {
        tmp = 0LL;
        for (k = 0; k < _c; k++) {
          tmp += M[i][k] * a.get(k, j);
          tmp %= _mod;
        }
        res.set(i, j, tmp);
      }
    }
    return res;
  }
  Matrix operator^(long long int pow) {
    Matrix res = iden(_r);
    if (pow == 0LL) {
      return res;
    } else if (pow == 1LL) {
      return *this;
    }
    if (pow & 1LL) {
      return *this * (*this ^ (pow - 1LL));
    } else {
      Matrix tmp = (*this ^ (pow >> 1LL));
      return tmp * tmp;
    }
  }
};
long long int cnt[110], dp[110];
Matrix a(101, 101), b(1, 101);
int main() {
  int n, x, i, j, t;
  long long int sum = 1LL;
  scanf("%d%d", &n, &x);
  for (i = 0; i < n; i++) {
    scanf("%d", &t);
    cnt[t]++;
  }
  dp[0] = 1LL;
  for (i = 1; i <= 100; i++) {
    for (j = 1; j <= i; j++) {
      dp[i] += cnt[j] * dp[i - j];
      dp[i] %= 1000000007LL;
    }
    sum += dp[i];
  }
  if (x <= 100) {
    long long int res = 0LL;
    for (i = 0; i <= x; i++) {
      res += dp[i];
      res %= 1000000007LL;
    }
    printf("%I64d", res);
    return 0;
  }
  b.set(0, 100, sum);
  for (i = 0; i < 100; i++) {
    b.set(0, i, dp[i + 1]);
  }
  a.set(100, 100, 1LL);
  for (i = 0; i < 99; i++) {
    a.set(i + 1, i, 1LL);
  }
  for (i = 1; i <= 100; i++) {
    a.set(100 - i, 99, cnt[i]);
    a.set(100 - i, 100, cnt[i]);
  }
  Matrix c = b * (a ^ (long long int)(x - 100));
  printf("%I64d\n", c.get(0, 100));
}
