#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline string get() {
  char ch[1000010];
  scanf("%s", ch);
  return ch;
}
const int MAX_LG = 60;
const long long maxn = 1e6 + 100;
const long long base = 29;
const long long mod = 1e9 + 7;
const long long INF = 1e18 + 100;
struct state {
  long long a = 0, b = 0, tp = 0;
  state() {}
  state(long long a, long long b, long long tp) : a(a), b(b), tp(tp) {}
};
long long cnt[maxn];
long long di[51][51][2];
long long C[51][51];
long long ways[51][51][2];
queue<state> q;
int32_t main() {
  long long n = in(), k = in();
  for (long long i = 0; i < n; i++) cnt[in() / 51]++;
  q.push({cnt[0], cnt[1], 0});
  for (long long i = 0; i <= 50; i++)
    for (long long j = 0; j <= 50; j++) di[i][j][0] = di[i][j][1] = INF;
  for (long long i = 0; i <= 50; i++) {
    for (long long j = 0; j <= i; j++) {
      if (j == 0)
        C[i][j] = 1;
      else
        C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
    }
  }
  di[cnt[0]][cnt[1]][0] = 0;
  ways[cnt[0]][cnt[1]][0] = 1;
  while (q.empty() == false) {
    state now = q.front();
    q.pop();
    long long a2 = cnt[0] - now.a;
    long long b2 = cnt[1] - now.b;
    for (long long i = 0; i <= now.a; i++) {
      for (long long j = 0; j <= now.b; j++) {
        if (i + j == 0) continue;
        if (i * 50 + j * 100 > k) continue;
        long long d2 = di[now.a][now.b][now.tp] + 1;
        long long *d3 = &di[a2 + i][b2 + j][now.tp ^ 1];
        if (*d3 == INF) {
          *d3 = d2;
          q.push({a2 + i, b2 + j, now.tp ^ 1});
        }
        if (*d3 == d2) {
          ways[a2 + i][b2 + j][now.tp ^ 1] += ways[now.a][now.b][now.tp] *
                                              C[now.a][i] % mod * C[now.b][j] %
                                              mod;
          if (ways[a2 + i][b2 + j][now.tp ^ 1] > mod)
            ways[a2 + i][b2 + j][now.tp ^ 1] -= mod;
        }
      }
    }
  }
  if (ways[cnt[0]][cnt[1]][1] == 0)
    return cout << -1 << "\n" << 0 << "\n", 0;
  else {
    cout << di[cnt[0]][cnt[1]][1] << "\n";
    cout << ways[cnt[0]][cnt[1]][1] << "\n";
  }
}
