#include #include using namespace std; using i32 = int; using i64 = long long; using i128 = __int128_t; using f64 = double; using p2 = pair; using p3 = tuple; using mint = atcoder::modint998244353; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } void _main() { i64 n, m, l; cin >> n >> m >> l; vector two(n + 1, 1); for (i64 i = 1; i <= n; i++) two[i] = two[i - 1] * 2; vector> cnt(m, vector(l, 0)); for (i64 i = 0; i < n; i++) { i64 a, b; cin >> a >> b; a--, b -= m + 1; cnt[a][b]++; } vector dp(1 << l, 0); dp[0] = 1; for (i64 i = 0; i < m; i++) { vector ndp(1 << l, 0); for (i64 j = 0; j < l; j++) { for (i64 k = (1 << l) - 1; k >= 0; k--) { ndp[k | (1 << j)] += ndp[k] * (two[cnt[i][j]] - 1); ndp[k | (1 << j)] += dp[k] * (two[cnt[i][j]] - 1); } } swap(dp, ndp); } cout << dp[(1 << l) - 1].val() << "\n"; }