#include <bits/stdc++.h>
using namespace std;
template <typename T, typename L>
bool smax(T &x, L y) {
  return x < y ? (x = y, true) : false;
}
template <typename T, typename L>
bool smin(T &x, L y) {
  return y < x ? (x = y, true) : false;
}
struct type {
  long long cnt, ways;
};
struct Zeus {
  int num1, num2;
  bool side;
};
void bfs();
const int MAXN = 64;
type dp[MAXN][MAXN][2];
bool mark[MAXN][MAXN][2];
long long c[MAXN][MAXN];
int n, k;
int cnt1, cnt2;
queue<Zeus> q;
int main() {
  ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    a == 50 ? cnt1++ : cnt2++;
  }
  for (int i = 0; i < MAXN; i++) {
    c[i][0] = 1;
    for (int j = 1; j <= i; j++) c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
  }
  bfs();
  if (!mark[cnt1][cnt2][1]) return cout << "-1\n0\n", false;
  return cout << dp[cnt1][cnt2][1].cnt << '\n'
              << dp[cnt1][cnt2][1].ways << '\n',
         false;
}
void bfs() {
  memset(dp, 0, sizeof dp);
  dp[cnt1][cnt2][0] = {0, 1};
  mark[cnt1][cnt2][0] = 1;
  q.push({cnt1, cnt2, 0});
  while (!q.empty()) {
    auto v = q.front();
    q.pop();
    int x = v.num1;
    int y = v.num2;
    bool m = v.side;
    for (int i = 0; i <= x; i++) {
      for (int j = 0; j <= y; j++) {
        if ((i || j) && i * 50 + j * 100 <= k) {
          if (!m) {
            if (!mark[cnt1 - x + i][cnt2 - y + j][1] ||
                dp[cnt1 - x + i][cnt2 - y + j][1].cnt > dp[x][y][m].cnt) {
              dp[cnt1 - x + i][cnt2 - y + j][1].ways +=
                  (dp[x][y][m].ways *
                   (((long long)c[x][i] * (long long)c[y][j]) % 1000000007ll)) %
                  1000000007ll;
              dp[cnt1 - x + i][cnt2 - y + j][1].ways %= 1000000007ll;
            }
            if (!mark[cnt1 - x + i][cnt2 - y + j][1]++)
              q.push({cnt1 - x + i, cnt2 - y + j, 1}),
                  dp[cnt1 - x + i][cnt2 - y + j][1].cnt = dp[x][y][m].cnt + 1;
          } else {
            if (!mark[cnt1 - x + i][cnt2 - y + j][0] ||
                dp[cnt1 - x + i][cnt2 - y + j][0].cnt > dp[x][y][m].cnt) {
              dp[cnt1 - x + i][cnt2 - y + j][0].ways +=
                  (dp[x][y][m].ways *
                   (((long long)c[x][i] * (long long)c[y][j]) % 1000000007ll)) %
                  1000000007ll;
              dp[cnt1 - x + i][cnt2 - y + j][0].ways %= 1000000007ll;
            }
            if (!mark[cnt1 - x + i][cnt2 - y + j][0]++)
              q.push({cnt1 - x + i, cnt2 - y + j, 0}),
                  dp[cnt1 - x + i][cnt2 - y + j][0].cnt = dp[x][y][m].cnt + 1;
          }
        }
      }
    }
  }
}
