#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int add(int a, int b) {
  long long x = a + b;
  if (x >= 1000000007) x -= 1000000007;
  if (x < 0) x += 1000000007;
  return x;
}
long long mul(long long a, long long b) { return (a * b) % 1000000007; }
long long pw(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = (ans * a) % 1000000007;
    a = (a * a) % 1000000007;
    b >>= 1;
  }
  return ans;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
long long rand_seed() {
  long long a = rng();
  return a;
}
int mn[3][52][52];
long long ct[3][52][52];
int combi[52][52];
struct str {
  int t, a, b;
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, k;
  cin >> n >> k;
  int n50 = 0, n100 = 0;
  for (int i = 1; i <= n; ++i) {
    int x;
    cin >> x;
    if (x == 50)
      n50++;
    else
      n100++;
  }
  for (int i = 0; i <= 1; ++i)
    for (int j = 0; j <= n50; ++j)
      for (int y = 0; y <= n100; ++y) mn[i][j][y] = -1;
  for (int i = 0; i <= 50; ++i) {
    combi[i][0] = 1;
    for (int j = 1; j <= i; ++j)
      combi[i][j] = add(combi[i - 1][j], combi[i - 1][j - 1]);
  }
  deque<str> d;
  d.push_back({0, 0, 0});
  mn[0][0][0] = 0;
  ct[0][0][0] = 1;
  while (!d.empty()) {
    str nod = d[0];
    d.pop_front();
    if (nod.t == 0) {
      for (int i = 0; i <= n50 - nod.a; ++i)
        for (int j = 0; j <= n100 - nod.b; ++j) {
          if (!i && !j) continue;
          if (i * 50 + j * 100 <= k) {
            if (mn[1][nod.a + i][nod.b + j] == -1) {
              mn[1][nod.a + i][nod.b + j] = mn[nod.t][nod.a][nod.b] + 1;
              ct[1][nod.a + i][nod.b + j] =
                  mul(ct[nod.t][nod.a][nod.b],
                      mul(combi[n50 - nod.a][i], combi[n100 - nod.b][j]));
              d.push_back({1, nod.a + i, nod.b + j});
            } else {
              if (mn[nod.t][nod.a][nod.b] + 1 == mn[1][nod.a + i][nod.b + j])
                ct[1][nod.a + i][nod.b + j] = add(
                    ct[1][nod.a + i][nod.b + j],
                    mul(ct[nod.t][nod.a][nod.b],
                        mul(combi[n50 - nod.a][i], combi[n100 - nod.b][j])));
            }
          }
        }
    } else {
      for (int i = 0; i <= nod.a; ++i)
        for (int j = 0; j <= nod.b; ++j) {
          if (!i && !j) continue;
          if (i * 50 + j * 100 <= k) {
            if (mn[0][nod.a - i][nod.b - j] == -1) {
              mn[0][nod.a - i][nod.b - j] = mn[nod.t][nod.a][nod.b] + 1;
              ct[0][nod.a - i][nod.b - j] =
                  mul(ct[nod.t][nod.a][nod.b],
                      mul(combi[nod.a][i], combi[nod.b][j]));
              d.push_back({0, nod.a - i, nod.b - j});
            } else {
              if (mn[nod.t][nod.a][nod.b] + 1 == mn[0][nod.a - i][nod.b - j])
                ct[0][nod.a - i][nod.b - j] =
                    add(ct[0][nod.a - i][nod.b - j],
                        mul(ct[nod.t][nod.a][nod.b],
                            mul(combi[nod.a][i], combi[nod.b][j])));
            }
          }
        }
    }
  }
  if (mn[1][n50][n100] == (1 << 20)) {
    cout << -1 << '\n';
    cout << 0 << '\n';
    return 0;
  }
  cout << mn[1][n50][n100] << '\n';
  cout << ct[1][n50][n100] << '\n';
  return 0;
}
