/**
* Solution by 1egend (polarity.sh)
* Date: 2025-02-08
* Contest: CEOI 2019
* Problem: amusementpark
**/
#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
using ll = long long;
using vi = vector<int>;
using vl = vector<ll>;
using pii = pair<int, int>;
#define pb push_back
#define rep(i, a, b) for(int i = (a); i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
const int MAX_N = 1e5 + 1;
const ll MOD = 998244353;
void solve(){
ll n, m; cin >> n >> m;
vector<vector<bool>> adj(n, vector<bool>(n, false));
rep(i, 0, m){
int a, b; cin >> a >> b;
--a; --b;
adj[a][b] = true;
adj[b][a] = true;
}
// legal = DAG, pair for m
// consider counting toposort orderings, bijection under indegree 0 "front elements", but the front set must be independent
bool indep[1 << n];
ll ones[1 << n];
ones[0] = -1;
indep[0] = true;
rep(i, 1, 1 << n){
ones[i] = -ones[i & (i - 1)];
bool yes = true;
vi chosen = {};
rep(j, 0, n){
if (i & (1 << j)){
rep(k, 0, chosen.size()){
if (adj[chosen[k]][j]){
yes = false;
break;
}
}
chosen.pb(j);
}
}
indep[i] = yes;
}
vl dp(1 << n, 0);
dp[0] = 1;
rep(i, 1, 1 << n){
for (int j = i; j != 0; j = (j - 1) & i){
if (indep[j]){
// PIE
dp[i] = (2 * MOD + dp[i] + ones[j] * dp[i ^ j]) % MOD;
}
}
}
cout << m * dp[(1 << n) - 1] % MOD * (MOD + 1)/2 % MOD << endl;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |