#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5 + 15;
const int mod = 1e9 + 7;
struct Sta {
  int l, r, step;
  Sta(int l, int r, int step) : l(l), r(r), step(step) {}
};
bool vis[55][55][2];
long long dis[55][55][1005];
long long C[55][55];
void init() {
  memset(C, 0, sizeof C);
  C[0][0] = 1;
  for (int i = 1; i <= 50; i++) {
    for (int j = 0; j <= i; j++) {
      C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
    }
  }
}
int main() {
  init();
  long long n, c, nx = 0, ny = 0;
  cin >> n >> c;
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    if (x == 50)
      nx++;
    else
      ny++;
  }
  memset(dis, 0, sizeof dis);
  memset(vis, 0, sizeof vis);
  dis[nx][ny][0] = 1;
  queue<Sta> que;
  que.push(Sta(nx, ny, 0));
  vis[nx][ny][0] = 1;
  while (que.size()) {
    Sta u = que.front();
    que.pop();
    if (u.step % 2 == 0) {
      for (int i = 0; i * 50 <= c; i++)
        for (int j = 0; i * 50 + j * 100 <= c; j++) {
          if (!i && !j) continue;
          if (u.l - i >= 0 && u.r - j >= 0) {
            dis[u.l - i][u.r - j][u.step + 1] =
                (dis[u.l - i][u.r - j][u.step + 1] +
                 (C[u.l][i] * C[u.r][j] % mod) * dis[u.l][u.r][u.step]) %
                mod;
            if (!vis[u.l - i][u.r - j][1]) {
              vis[u.l - i][u.r - j][1] = 1;
              que.push(Sta(u.l - i, u.r - j, u.step + 1));
            }
          }
        }
    } else {
      for (int i = 0; i * 50 <= c; i++)
        for (int j = 0; i * 50 + j * 100 <= c; j++) {
          if (!i && !j) continue;
          if (u.l + i <= nx && u.r + j <= ny) {
            dis[u.l + i][u.r + j][u.step + 1] =
                (dis[u.l + i][u.r + j][u.step + 1] +
                 (C[nx - u.l][i] * C[ny - u.r][j] % mod) *
                     dis[u.l][u.r][u.step]) %
                mod;
            if (!vis[u.l + i][u.r + j][0]) {
              vis[u.l + i][u.r + j][0] = 1;
              que.push(Sta(u.l + i, u.r + j, u.step + 1));
            }
          }
        }
    }
  }
  int ans = -1, i;
  for (i = 1; i <= 1000; i++) {
    if (dis[0][0][i]) {
      ans = i;
      break;
    }
  }
  if (ans == -1)
    cout << ans << endl << 0 << endl;
  else
    cout << ans << endl << (dis[0][0][i] % mod) << endl;
  return 0;
}
