MOD = 998244353 INF = 1 << 62 N, W = map(int, input().split()) items = [] for i in range(N): v, w = map(int, input().split()) items.append((v, w)) dp0 = {0: 0} # dp[重さ] = 最大価値 dp1 = {0: 1} # 通り数 for v, w in items: pp0 = dp0.copy() pp1 = dp1.copy() dp0, pp0 = pp0, dp0 dp1, pp1 = pp1, dp1 for w0, v0 in pp0.items(): if dp0.get(w0 + w, -INF) < v0 + v: dp0[w0 + w] = v0 + v dp1[w0 + w] = pp1[w0] elif dp0.get(w0 + w, -INF) == v0 + v: dp1[w0 + w] += pp1[w0] dp1[w0 + w] %= MOD max_v = -INF ways = 0 for k, v in dp0.items(): if k > W: continue if max_v < v: max_v = v ways = dp1[k] elif max_v == v: ways += dp1[k] ways %= MOD print(max_v, ways)