func_code_string: #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;   }   