#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
const long long INF = 1000000000;
struct wie {
  int il_50, il_100, str;
};
int main() {
  ios_base::sync_with_stdio(0);
  int n, k;
  cin >> n >> k;
  int p = 0, s = 0;
  for (int i = 0; i < n; ++i) {
    int x;
    cin >> x;
    if (x == 50)
      ++p;
    else
      ++s;
  }
  vector<vector<long long> > C(51, vector<long long>(51));
  for (int i = 0; i <= 50; ++i) {
    for (int j = 0; j <= i; ++j) {
      if (j == 0 || j == i)
        C[i][j] = 1;
      else
        C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
    }
  }
  long long il[51][51][2];
  long long odl[51][51][2];
  bool odw[51][51][2];
  for (int i = 0; i < 51; ++i) {
    for (int j = 0; j < 51; ++j) {
      for (int l = 0; l < 2; ++l) {
        odw[i][j][l] = false;
        odl[i][j][l] = -1;
      }
    }
  }
  queue<wie> Q;
  Q.push({p, s, 1});
  odw[p][s][1] = true;
  while (!Q.empty()) {
    wie akt = Q.front();
    Q.pop();
    if (akt.il_100 == s && akt.il_50 == p && akt.str == 1) {
      odl[akt.il_50][akt.il_100][akt.str] = 0;
      il[akt.il_50][akt.il_100][akt.str] = 1;
      for (int i = 0; i <= akt.il_50; ++i) {
        for (int j = 0; j <= akt.il_100; ++j) {
          wie nowy = {p - akt.il_50 + i, s - akt.il_100 + j, (akt.str ^ 1)};
          if (i + j != 0 && 50 * i + 100 * j <= k) {
            Q.push(nowy);
            odw[nowy.il_50][nowy.il_100][nowy.str] = true;
          }
        }
      }
    } else {
      odl[akt.il_50][akt.il_100][akt.str] = INF;
      il[akt.il_50][akt.il_100][akt.str] = 0;
      for (int i = 0; i <= akt.il_50; ++i) {
        for (int j = 0; j <= akt.il_100; ++j) {
          wie nowy = {p - akt.il_50 + i, s - akt.il_100 + j, (akt.str ^ 1)};
          if (i + j != 0 && 50 * i + 100 * j <= k) {
            if (odw[nowy.il_50][nowy.il_100][nowy.str]) {
              if (odl[nowy.il_50][nowy.il_100][nowy.str] != -1) {
                odl[akt.il_50][akt.il_100][akt.str] =
                    min(odl[akt.il_50][akt.il_100][akt.str],
                        odl[nowy.il_50][nowy.il_100][nowy.str] + 1);
                il[akt.il_50][akt.il_100][akt.str] =
                    (il[akt.il_50][akt.il_100][akt.str] +
                     (C[akt.il_50][i] * C[akt.il_100][j]) % MOD *
                         il[nowy.il_50][nowy.il_100][nowy.str]) %
                    MOD;
              }
            } else {
              Q.push(nowy);
              odw[nowy.il_50][nowy.il_100][nowy.str] = true;
            }
          }
        }
      }
    }
  }
  if (odw[p][s][0])
    cout << odl[p][s][0] << " " << il[p][s][0];
  else
    cout << "-1 0";
  return 0;
}
