Submission #1111241

#TimeUsernameProblemLanguageResultExecution timeMemory
1111241ThunnusAmusement Park (CEOI19_amusementpark)C++17
100 / 100
2229 ms10976 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; #define int i64 #define vi vector<int> #define vvi vector<vi> #define vb vector<bool> #define pii pair<int, int> #define fi first #define se second #define sz(x) (int)(x).size() const int MAXN = 18; const int MOD = 998244353; int adj[1 << MAXN], popcnt[1 << MAXN], pie[1 << MAXN], nodeid[1 << MAXN], f[1 << MAXN]; bool indepset[1 << MAXN]; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, m, u, v; cin >> n >> m; for(int i = 0; i < m; i++){ cin >> u >> v; u--, v--; adj[u] |= (1ll << v); adj[v] |= (1ll << u); } for(int i = 0; i < n; i++){ nodeid[1ll << i] = i; } for(int i = 0; i < (1ll << n); i++){ popcnt[i] = popcnt[i >> 1] + (i & 1); pie[i] = (popcnt[i] % 2) * 2 - 1; } indepset[0] = true; for(int i = 1; i < (1ll << n); i++){ if(indepset[i & (i - 1)] && ((adj[nodeid[i & -i]] & (i & (i - 1))) == 0)){ // deciding whether the subset including the nodes in the mask id DAG indepset[i] = true; } } f[0] = 1; for(int i = 1; i < (1ll << n); i++){ // O(3^n) for(int j = i; j; j = (j - 1) & i){ if(indepset[j]){ f[i] = (f[i] + pie[j] * f[i ^ j]) % MOD; // PIE } } } f[(1 << n) - 1] = (f[(1 << n) - 1] + MOD) % MOD; cout << f[(1 << n) - 1] * m % MOD * ((MOD + 1) / 2) % MOD; // (MODE + 1) / 2 is the modular inverse of 2. 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...