제출 #1177577

#제출 시각아이디문제언어결과실행 시간메모리
1177577vjudge2Amusement Park (CEOI19_amusementpark)C++20
100 / 100
2021 ms4800 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int mod = 998244353;

const int N = 1 << 18;
int dp[N], conn[18][18], sb[N];
bool indep[N];

int bm(int b, int p) {
    if (!p) return 1;
    int res = bm(b, p / 2);
    res = res * res % mod;
    if (p % 2 == 1) res = res * b % mod;
    return res;
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        conn[u][v] = 1;
    }
    for (int i = 0; i < (1 << n); i++) {
        indep[i] = 1;
        for (int j = 0; j < n; j++) if ((1 << j) & i) sb[i]++;
        sb[i]++;
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                if ((i & (1 << j)) && (i & (1 << k)) && conn[j][k]) {
                    indep[i] = 0;
                    break;
                }
            }
            if (!indep[i]) break;
        }
    }
    dp[0] = 1;
    for (int i = 1; i < (1 << n); i++) {
        for (int j = i; j; j = (j - 1) & i) {
            if (indep[j]) (dp[i] += (dp[i ^ j] * ((sb[j] % 2 == 1) ? mod-1 : 1)) % mod) %= mod;
        }
    }
    cout << dp[(1 << n) - 1] * m % mod * bm(2, mod-2) % mod << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...