Submission #1262273

#TimeUsernameProblemLanguageResultExecution timeMemory
1262273euclidAmusement Park (CEOI19_amusementpark)C++20
100 / 100
1944 ms2756 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define fi first #define se second #define vi vector<int> #define pii pair<int, int> #define pll pair<ll, ll> #define vl vector<ll> int n, m; const int MN = 21, MS = (1<<18)+7, MOD = 998244353; bool adj[MN][MN], f[MS]; //f[s]: whether s is an independent set ll dp[MS]; //dp[s]: number of DAGs that can be formed by the points in s int bits(int x) {return __builtin_popcount(x);} int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for(int i = 1; i <= m; i++) { int u, v; cin >> u >> v; adj[u][v] = adj[v][u] = true; //ignore direction here } for(int i = 0; i < n; i++) dp[1<<i] = 1, f[1<<i] = true; for(int s = 1; s < 1<<n; s++) { if(bits(s)==1) continue; int lb = s&(-s), llb = (s^lb)&(-(s^lb)); f[s] = f[s^lb] && f[s^llb] && !adj[(int)log2(lb)+1][(int)log2(llb)+1]; } dp[0] = 1; for(int s = 1; s < 1<<n; s++) { if(bits(s)==1) continue; for(int ss = s; ss > 0; ss=(ss-1)&s) { if(!f[ss]) continue; ll d = dp[s^ss]; if(bits(ss)%2==0) d *= -1; dp[s] = (dp[s]+d+MOD)%MOD; } } cout << dp[(1<<n)-1]*(MOD+1)/2%MOD*m%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...