Submission #1279638

#TimeUsernameProblemLanguageResultExecution timeMemory
1279638not_amirAmusement Park (CEOI19_amusementpark)C++20
100 / 100
1820 ms1496 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

constexpr int MOD = 998'244'353;

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    vector<vector<bool>> G(n, vector<bool>(n));
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        G[u - 1][v - 1] = G[v - 1][u - 1] = true;
    }
    vector<bool> independent(1 << n);
    independent[0] = true;
    for (int i = 1; i < 1 << n; i++) {
        int v = -1;
        for (int j = 0; v == -1 && j < n; j++)
            if (i >> j & 1) v = j;
        independent[i] = independent[i ^ 1 << v];
        for (int j = v + 1; j < n; j++)
            if (i >> j & 1 && G[v][j])
                independent[i] = false;
    }
    vector<int> dp(1 << n);
    dp[0] = 1;
    for (int i = 1; i < 1 << n; i++)
        for (int j = i; j; j = j - 1 & i)
            if (independent[j])
                dp[i] = (dp[i] + 1ll * (__builtin_popcount(j) % 2 ? 1 : MOD - 1) * dp[i ^ j]) % MOD;
    cout << (1ll * dp[(1 << n) - 1] * m % MOD * ((MOD + 1) / 2) % MOD);
}
#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...