#include <bits/stdc++.h>
struct sState {
  int a, b, t;
};
sState Q[5009];
int L, R;
long long cnt[50][50][2];
int dist[50][50][2];
long long C[51][51];
int main() {
  for (int i = 0; i <= 50; i++) C[0][i] = 1LL;
  for (int i = 1; i <= 50; i++) {
    for (int j = 1; j <= i; j++) {
      C[j][i] = (C[j][i - 1] + C[j - 1][i - 1]) % 1000000007;
    }
  }
  int n, k;
  scanf("%d %d", &n, &k);
  k /= 50;
  int a = 0, b = 0;
  for (int i = 0; i < n; i++) {
    int t;
    scanf("%d", &t);
    if (t == 50)
      a++;
    else
      b++;
  }
  for (int i = 0; i < 50; i++)
    for (int j = 0; j < 50; j++)
      for (int k = 0; k < 2; k++) dist[i][j][k] = 1000000000;
  dist[a][b][0] = 0;
  cnt[a][b][0] = 1;
  Q[0].a = a, Q[0].b = b, Q[0].t = 0;
  R++;
  while (L < R) {
    sState cur = Q[L++];
    if (cur.t == 0) {
      for (int x = 0; x <= cur.a; x++) {
        for (int y = 0; y <= cur.b; y++) {
          if (x + y == 0 || x + 2 * y > k) continue;
          if (dist[cur.a - x][cur.b - y][1] > dist[cur.a][cur.b][0] + 1) {
            dist[cur.a - x][cur.b - y][1] = dist[cur.a][cur.b][0] + 1;
            cnt[cur.a - x][cur.b - y][1] = C[x][cur.a] * C[y][cur.b] %
                                           1000000007 * cnt[cur.a][cur.b][0] %
                                           1000000007;
            sState tmp = {cur.a - x, cur.b - y, 1};
            Q[R++] = tmp;
          } else if (dist[cur.a - x][cur.b - y][1] ==
                     dist[cur.a][cur.b][0] + 1) {
            cnt[cur.a - x][cur.b - y][1] =
                (cnt[cur.a - x][cur.b - y][1] +
                 C[x][cur.a] * C[y][cur.b] % 1000000007 * cnt[cur.a][cur.b][0] %
                     1000000007) %
                1000000007;
          }
        }
      }
    } else {
      for (int x = 0; x <= a - cur.a; x++) {
        for (int y = 0; y <= b - cur.b; y++) {
          if (x + y == 0 || x + 2 * y > k) continue;
          if (dist[cur.a + x][cur.b + y][0] > dist[cur.a][cur.b][1] + 1) {
            dist[cur.a + x][cur.b + y][0] = dist[cur.a][cur.b][1] + 1;
            cnt[cur.a + x][cur.b + y][0] = C[x][a - cur.a] * C[y][b - cur.b] %
                                           1000000007 * cnt[cur.a][cur.b][1] %
                                           1000000007;
            sState tmp = {cur.a + x, cur.b + y, 0};
            Q[R++] = tmp;
          } else if (dist[cur.a + x][cur.b + y][0] ==
                     dist[cur.a][cur.b][1] + 1) {
            cnt[cur.a + x][cur.b + y][0] =
                (cnt[cur.a + x][cur.b + y][0] +
                 C[x][a - cur.a] * C[y][b - cur.b] % 1000000007 *
                     cnt[cur.a][cur.b][1] % 1000000007) %
                1000000007;
          }
        }
      }
    }
  }
  if (dist[0][0][1] == 1000000000)
    printf("-1\n");
  else
    printf("%d\n", dist[0][0][1]);
  printf("%d\n", cnt[0][0][1]);
}
