제출 #572694

#제출 시각아이디문제언어결과실행 시간메모리
572694piOOEAmusement Park (CEOI19_amusementpark)C++17
0 / 100
1 ms340 KiB
#include <bits/stdc++.h> using namespace std; #define sz(x) ((int)size(x)) #define all(x) begin(x), end(x) #define trace(x) cout << #x << ": " << (x) << endl; typedef long long ll; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return (int) ((ll) rnd() % (r - l + 1)) + l; } const int N = 18, mod = 998244353; int sum[1 << N], dp[1 << N]; vector<int> g[N], rg[N]; bool used[N]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; --a, --b; g[a].push_back(b); rg[b].push_back(a); } for (int mask = 1; mask < (1 << n); ++mask) { vector<int> now; memset(used, 0, sizeof(used)); for (int i = 0; i < n; ++i) { if (mask & 1 << i) { used[i] = true; now.push_back(i); } } if (sz(now) == 1) { dp[mask] = 1; sum[mask] = 0; } else { bool none = true; for (int i: now) { int msk = mask ^ (1 << i); int cnt = 0; for (int to: rg[i]) { if (used[to]) { ++cnt; } } if (cnt) { dp[mask] = (dp[mask] + dp[msk]) % mod; sum[mask] = (sum[mask] + sum[msk] + dp[msk] * (ll) cnt) % mod; none = false; } } if (none) { dp[mask] = 1; } } } cout << sum[(1 << n) - 1]; 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...