from collections import defaultdict 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)) # key : 重さ # val : (最大価値, 通り数) dp = {0: (0, 1)} for v, w in items: pp = dp.copy() dp, pp = pp, dp for w0, (v0, cnt0) in pp.items(): nw = w0 + w nv = v0 + v if nw > W + 10000: # 負の重さがあるので上限値で枝刈り continue prev = dp.get(nw) if prev is None or prev[0] < nv: dp[nw] = (nv, cnt0) elif prev[0] == nv: dp[nw] = (nv, (prev[1] + cnt0) % MOD) max_v = max(v for w, (v, _) in dp.items() if w <= W) ways = 0 for w, (v, cnt) in dp.items(): if w <= W and v == max_v: ways += cnt ways %= MOD print(max_v, ways)