mod = 998244353 def fzt(lst, N): ret_lst = lst for i in range(N): for j in range(1 << N): if not (j >> i) & 1: ret_lst[j + (1 << i)] += ret_lst[j] ret_lst[j + (1 << i)] %= mod return ret_lst def fmt(lst, N): ret_lst = lst for i in range(N): for j in range(1 << N): if (j >> i) & 1: ret_lst[j] -= ret_lst[j - (1 << i)] ret_lst[j] %= mod return ret_lst def or_convolution(f, g, N): fw = fzt(f, N) gw = fzt(g, N) hw = [(fw[i] * gw[i]) % mod for i in range(1 << N)] h = fmt(hw, N) return h N, M, L = map(int, input().split()) A = [] B = [] for _ in range(N): a, b = map(int, input().split()) A.append(a - 1) B.append(b - M - 1) pow_2 = [1] for _ in range(N): prev_2 = pow_2[-1] pow_2.append((prev_2 * 2) % mod) cnts = [[0 for _ in range(L)] for _ in range(M)] for i in range(N): cnts[A[i]][B[i]] += 1 ans_l = [0 for _ in range(1 << L)] ans_l[0] = 1 for i in range(M): g_l = [0 for _ in range(1 << L)] for j in range(1, 1 << L): sub = 1 for k in range(L): if (j >> k) & 1: sub = (sub * (pow_2[cnts[i][k]] - 1)) % mod g_l[j] = sub ans_l_new = or_convolution(ans_l, g_l, L) ans_l = ans_l_new print(ans_l[-1])