#include #include using namespace std; using ll = long long; const ll mod = 998244353; vector fzt(vector &vec, ll N){ vector ret(1 << N); for (ll i = 0; i < (1 << N); i++){ ret[i] = vec[i]; } for (ll i = 0; i < N; i++){ for (ll j = 0; j < (1 << N); j++){ if (!((j >> i) & 1)){ ret[j + (1 << i)] = (ret[j + (1 << i)] + ret[j]) % mod; } } } return ret; } vector fmt(vector &vec, ll N){ vector ret(1 << N); for (ll i = 0; i < (1 << N); i++){ ret[i] = vec[i]; } for (ll i = 0; i < N; i++){ for (ll j = 0; j < (1 << N); j++){ if ((j >> i) & 1){ ret[j] = (ret[j] + mod - ret[j - (1 << i)]) % mod; } } } return ret; } vector or_convolution(vector &f, vector &g, ll N){ vector fw = fzt(f, N); vector gw = fzt(g, N); vector hw(1 << N); for (ll i = 0; i < (1 << N); i++){ hw[i] = (fw[i] * gw[i]) % mod; } vector h = fmt(hw, N); return h; } int main(){ ll N, M, L; cin >> N >> M >> L; vector A(N); vector B(N); for (ll i = 0; i < N; i++){ cin >> A[i] >> B[i]; A[i]--; B[i] -= (M + 1); } vector pow_2(N + 1); pow_2[0] = 1; for (ll i = 0; i < N; i++){ pow_2[i + 1] = (pow_2[i] * 2LL) % mod; } vector> cnts(M, vector(L, 0)); for (ll i = 0; i < N; i++){ cnts[A[i]][B[i]]++; } vector ans_vec(1 << L, 0); ans_vec[0] = 1; for (ll i = 0; i < M; i++){ vector g_vec(1 << L, 0); for (ll j = 1; j < (1 << L); j++){ ll sub = 1; for (ll k = 0; k < L; k++){ if ((j >> k) & 1){ sub = (sub * (pow_2[cnts[i][k]] + mod - 1)) % mod; } } g_vec[j] = sub; } vector ans_vec_new = or_convolution(ans_vec, g_vec, L); ans_vec = ans_vec_new; } cout << ans_vec[(1 << L) - 1] << endl; }