|
| 1 | +// @brief Chromatic Polynomial |
| 2 | +#define PROBLEM "https://judge.yosupo.jp/problem/chromatic_polynomial" |
| 3 | +#pragma GCC optimize("O3,unroll-loops") |
| 4 | +#include <bits/allocator.h> |
| 5 | +#pragma GCC target("avx2") |
| 6 | +#include <iostream> |
| 7 | +#include "blazingio/blazingio.min.hpp" |
| 8 | +#define CP_ALGO_CHECKPOINT |
| 9 | +#include "cp-algo/number_theory/modint.hpp" |
| 10 | +#include "cp-algo/math/subset_convolution.hpp" |
| 11 | +#include "cp-algo/math/poly.hpp" |
| 12 | +#include <bits/stdc++.h> |
| 13 | + |
| 14 | +using namespace std; |
| 15 | + |
| 16 | +const int mod = 998244353; |
| 17 | +using base = cp_algo::math::modint<mod>; |
| 18 | +using polyn = cp_algo::math::poly_t<base>; |
| 19 | + |
| 20 | +cp_algo::big_vector<base> indep_subsets(auto const& adj) { |
| 21 | + uint32_t n = (uint32_t)size(adj); |
| 22 | + uint32_t masks = 1 << n; |
| 23 | + cp_algo::big_vector<base> indep(masks); |
| 24 | + indep[0] = base(1); |
| 25 | + for(uint32_t v = 0; v < n; v++) { |
| 26 | + uint32_t delta = 1 << v; |
| 27 | + if (adj[v] & delta) continue; |
| 28 | + for(uint32_t mask = 0; mask < delta; mask++) { |
| 29 | + indep[mask + delta] = (adj[v] & mask) ? base(0) : indep[mask]; |
| 30 | + } |
| 31 | + } |
| 32 | + return indep; |
| 33 | +} |
| 34 | + |
| 35 | +void solve() { |
| 36 | + size_t n, m; |
| 37 | + cin >> n >> m; |
| 38 | + vector<uint64_t> adj(n); |
| 39 | + for(size_t i = 0; i < m; i++) { |
| 40 | + int u, v; |
| 41 | + cin >> u >> v; |
| 42 | + adj[u] |= 1 << v; |
| 43 | + adj[v] |= 1 << u; |
| 44 | + } |
| 45 | + auto indep = indep_subsets(adj); |
| 46 | + cp_algo::big_vector<base> w(1 << n); |
| 47 | + w.back() = 1; // w[S] = 1 if S is the full set, else 0 |
| 48 | + auto Y = cp_algo::math::subset_power_projection<base>(indep, w, n+1); |
| 49 | + cp_algo::big_vector<base> X(n+1); |
| 50 | + std::ranges::iota(X, 0); |
| 51 | + auto res = polyn::inter(X, Y); |
| 52 | + res.print(n+1); |
| 53 | +} |
| 54 | + |
| 55 | +signed main() { |
| 56 | + //freopen("input.txt", "r", stdin); |
| 57 | + ios::sync_with_stdio(0); |
| 58 | + cin.tie(0); |
| 59 | + int t; |
| 60 | + t = 1;// cin >> t; |
| 61 | + while(t--) { |
| 62 | + solve(); |
| 63 | + } |
| 64 | +} |
0 commit comments