#include <bits/stdc++.h>
using namespace std;
struct Triple {
  int a;
  int b;
  int c;
  Triple(int x, int y, int z) {
    a = x;
    b = y;
    c = z;
  }
};
const int MOD = 1000000007;
int n, lim, pie, sto;
int dwumian[107][107];
int dp[2][107][107];
bool odw[2][107][107];
int odl[2][107][107];
queue<Triple> Q;
int main() {
  scanf("%d%d", &n, &lim);
  while (n--) {
    int x;
    scanf("%d", &x);
    x == 50 ? ++pie : ++sto;
  }
  for (int i = 1; i < 107; ++i) dwumian[i][0] = 1;
  dwumian[0][0] = 1;
  dwumian[1][1] = 1;
  for (int i = 2; i <= 105; ++i)
    for (int j = 1; j <= i; ++j)
      dwumian[i][j] = (dwumian[i - 1][j - 1] + dwumian[i - 1][j]) % MOD;
  Triple t(0, pie, sto);
  odw[t.a][t.b][t.c] = 1;
  dp[t.a][t.b][t.c] = 1;
  Q.push(t);
  while (!Q.empty()) {
    t = Q.front();
    Q.pop();
    int a = t.a, b = t.b, c = t.c;
    if (a == 0) {
      for (int pierwsze = 0; pierwsze <= b; ++pierwsze) {
        for (int drugie = 0; drugie <= c; ++drugie) {
          if (pierwsze + drugie > 0 && pierwsze * 50 + drugie * 100 <= lim) {
            int A = 1, B = b - pierwsze, C = c - drugie;
            if (odw[A][B][C] == 0) {
              Q.push(Triple(A, B, C));
              odw[A][B][C] = 1;
              odl[A][B][C] = odl[a][b][c] + 1;
              int pomocnik =
                  ((long long int)dwumian[b][pierwsze] * dwumian[c][drugie]) %
                  MOD;
              dp[A][B][C] = ((long long int)dp[a][b][c] * pomocnik) % MOD;
            } else if (odl[A][B][C] == odl[a][b][c] + 1) {
              int pomocnik =
                  ((long long int)dwumian[b][pierwsze] * dwumian[c][drugie]) %
                  MOD;
              dp[A][B][C] = (dp[A][B][C] +
                             ((long long int)dp[a][b][c] * pomocnik) % MOD) %
                            MOD;
            }
          }
        }
      }
    } else {
      int Pp = pie - b, PP = sto - c;
      for (int pierwsze = 0; pierwsze <= Pp; ++pierwsze) {
        for (int drugie = 0; drugie <= PP; ++drugie) {
          if (pierwsze + drugie > 0 && pierwsze * 50 + drugie * 100 <= lim) {
            int A = 0, B = b + pierwsze, C = c + drugie;
            if (odw[A][B][C] == 0) {
              Q.push(Triple(A, B, C));
              odw[A][B][C] = 1;
              odl[A][B][C] = odl[a][b][c] + 1;
              int pomocnik =
                  ((long long int)dwumian[Pp][pierwsze] * dwumian[PP][drugie]) %
                  MOD;
              dp[A][B][C] = ((long long int)dp[a][b][c] * pomocnik) % MOD;
            } else if (odl[A][B][C] == odl[a][b][c] + 1) {
              int pomocnik =
                  ((long long int)dwumian[Pp][pierwsze] * dwumian[PP][drugie]) %
                  MOD;
              dp[A][B][C] = (dp[A][B][C] +
                             ((long long int)dp[a][b][c] * pomocnik) % MOD) %
                            MOD;
            }
          }
        }
      }
    }
  }
  if (odl[1][0][0] == 0) odl[1][0][0] = -1;
  printf("%d\n%d", odl[1][0][0], dp[1][0][0]);
}
