Skip to content

Commit b00e94f

Browse files
committed
Chromatic Polynomial test
1 parent c2a8d2e commit b00e94f

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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

Comments
 (0)