#include using namespace std; void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); } #include using mint = atcoder::modint998244353; int main() { fast_io(); int n, W; cin >> n >> W; vector v(n), w(n); for (int i = 0; i < n; i++) { cin >> v[i] >> w[i]; } int offset = 20000; int ma = 50000; const long long INF = 1e18; vector dp(ma + 1, -INF); dp[offset] = 0; vector cnt(ma + 1, 0); cnt[offset] = 1; for (int i = 0; i < n; i++) { vector dp_new = dp; vector cnt_new = cnt; for (int j = 0; j <= ma; j++) { if (dp[j] == -INF) { continue; } if (j + w[i] >= 0 && j + w[i] <= ma) { if (dp_new[j + w[i]] < dp[j] + v[i]) { dp_new[j + w[i]] = dp[j] + v[i]; cnt_new[j + w[i]] = cnt[j]; } else if (dp_new[j + w[i]] == dp[j] + v[i]) { cnt_new[j + w[i]] += cnt[j]; } } } dp = dp_new; cnt = cnt_new; } long long v_max = -INF; for (int i = 0; i <= ma; i++) { if (i - offset <= W) { v_max = max(v_max, dp[i]); } } mint ans = 0; for (int i = 0; i <= ma; i++) { if (i - offset <= W && dp[i] == v_max) { ans += cnt[i]; } } cout << v_max << " " << ans.val() << endl; }