Submission #1110975

#TimeUsernameProblemLanguageResultExecution timeMemory
1110975crafticatAmusement Park (CEOI19_amusementpark)C++17
19 / 100
3062 ms592 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename T>
using V = vector<T>;
using vi = V<int>;
using vb = V<bool>;
using pi = pair<int,int>;

#define F0R(i,n) for (int i = 0; i < n;i++)
#define FOR(i, j, n) for(int i = j; i < n;i++)
#define ckmin(x,y) x = min(x,y)
#define f first
#define s second
using ll = long long;
constexpr int MOD = 998244353;

V<int> vis;
V<V<int>> g;

bool dfs(int x) {
    if (vis[x] == 1) return false;
    vis[x] = 1;
    for (auto y : g[x]) {
        if (vis[y] == 2) continue;
        if (!dfs(y)) return false;
    }

    vis[x] = 2;
    return true;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);

    int n, m; cin >> n >> m;
    V<pi> edges(m);

    F0R(i, m) {
        int x, y; cin >> x >> y;
        edges[i] = {x,y};
    }

    ll ans = 0;
    for (int i = 1; i < (1 << m); ++i) {
        bitset<32> mask = i;
        int cost = 0;
        g.clear();
        vis.clear();
        vis.resize(n + 1);
        g.resize(n + 1);

        F0R(j, m) {
            auto [a, b] = edges[j];
            if (mask[j]) {
                cost++;
                swap(a,b);
            }
            g[a].push_back(b);
        }

        bool pos = true;
        FOR(k, 1, n + 1) {
            if (vis[k] == 2) continue;
            if (!dfs(k)) pos = false;
        }
        if (pos) ans += cost;
        ans %= MOD;
    }

    cout << ans;

    return 0;
}
#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...