This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Source: https://oj.uz/problem/view/CEOI19_amusementpark
//
#include "bits/stdc++.h"
using namespace std;
#define s second
#define f first
#define pb push_back
typedef long long ll;
typedef pair<ll, ll> pii;
typedef vector<pii> vpii;
typedef vector<ll> vi;
#define FOR(i, a, b) for (ll i = (a); i<b; i++)
const ll N = 18;
ll indep[1 << N];
ll dp[1 << N];
ll sz[1 << N];
vi adj[N];
const ll MOD = 998244353;
ll binpow(ll x, ll n) {
assert(n >= 0);
x %= MOD; // note: m * m must be less than 2^63 to avoid ll overflow
ll res = 1;
while (n > 0) {
if (n % 2 == 1) { res = res * x % MOD; }
x = x * x % MOD;
n /= 2;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n, m;
cin >> n >> m;
FOR(i, 0, m) {
ll a, b;
cin >> a >> b;
a--;b--;
adj[a].pb(b);
adj[b].pb(a);
}
FOR(i, 0, 1 << n) {
dp[i]=0;
indep[i]=true;
sz[i] = 0;
FOR(j, 0, n) {
if ((1 << j) & i) {
for (auto val: adj[j]) {
if ((1 << val) & i) indep[i]=false;
}
sz[i] ++;
}
}
// cout << i << ' ' << indep[i] << endl;
if (sz[i] % 2 == 1) sz[i] = 1;
else sz[i] = -1;
}
dp[0] = 1;
FOR(i, 1, 1 << n) {
dp[i] = 0;
for (ll j = i; j; j = (j - 1) & i) {
// cout << ' ' << j << dp[i ^ j] << dp[i] << sz[j] << indep[j] << endl;
if (indep[j]) dp[i] = ((dp[i] + dp[i ^ j] * sz[j])) % MOD;
}
// cout << i << ' ' << dp[i] << endl;
}
dp[(1 << n) - 1] = (dp[(1 << n) - 1] + MOD) % MOD;
cout << ((dp[(1 << n) - 1] * m) % MOD * binpow(2, MOD - 2)) % MOD << endl;
}
# | 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... |