For problem statement at 0-999/500-599/510-519/512/problemD.txt this is a correct solution, but verifier at 0-999/500-599/510-519/512/verifierD.go ends with All 204 tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 1000000009
func add(a, b int) int {
return (a + b) % MOD
}
func sub(a, b int) int {
return (a - b%MOD + MOD) % MOD
}
func mul(a, b int) int {
return int((int64(a) * int64(b)) % MOD)
}
func power(base, exp int) int {
res := 1
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = mul(res, base)
}
base = mul(base, base)
exp /= 2
}
return res
}
func inv(n int) int {
return power(n, MOD-2)
}
func poly_add(a, b []int) []int {
sz := len(a)
if len(b) > sz {
sz = len(b)
}
res := make([]int, sz)
for i := 0; i < sz; i++ {
if i < len(a) {
res[i] = add(res[i], a[i])
}
if i < len(b) {
res[i] = add(res[i], b[i])
}
}
return res
}
func poly_sub(a, b []int) []int {
sz := len(a)
if len(b) > sz {
sz = len(b)
}
res := make([]int, sz)
for i := 0; i < sz; i++ {
if i < len(a) {
res[i] = add(res[i], a[i])
}
if i < len(b) {
res[i] = sub(res[i], b[i])
}
}
return res
}
func poly_mul(a, b []int) []int {
if len(a) == 0 || len(b) == 0 {
return []int{}
}
res := make([]int, len(a)+len(b)-1)
for i := 0; i < len(a); i++ {
for j := 0; j < len(b); j++ {
res[i+j] = add(res[i+j], mul(a[i], b[j]))
}
}
return res
}
var inv_arr []int
func solve_tree(u, p int, adj [][]int, in_K []bool) (int, int, []int) {
S_u := 1
W_full := 1
DP_u := []int{1}
for _, v := range adj[u] {
if v == p || in_K[v] {
continue
}
S_v, W_v, DP_v := solve_tree(v, u, adj, in_K)
S_u += S_v
W_full = mul(W_full, W_v)
poly_v := make([]int, len(DP_v))
copy(poly_v, DP_v)
for len(poly_v) <= S_v {
poly_v = append(poly_v, 0)
}
poly_v[S_v] = add(poly_v[S_v], W_v)
DP_u = poly_mul(DP_u, poly_v)
}
W_full = mul(W_full, inv_arr[S_u])
return S_u, W_full, DP_u
}
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m int
if _, err := fmt.Fscan(reader, &n, &m); err != nil {
return
}
adj := make([][]int, n+1)
for i := 0; i < m; i++ {
var u, v int
fmt.Fscan(reader, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
inv_arr = make([]int, n+1)
for i := 1; i <= n; i++ {
inv_arr[i] = inv(i)
}
fact := make([]int, n+1)
fact[0] = 1
for i := 1; i <= n; i++ {
fact[i] = mul(fact[i-1], i)
}
deg := make([]int, n+1)
for u := 1; u <= n; u++ {
deg[u] = len(adj[u])
}
q := []int{}
in_K := make([]bool, n+1)
for u := 1; u <= n; u++ {
in_K[u] = true
if deg[u] <= 1 {
q = append(q, u)
in_K[u] = false
}
}
for len(q) > 0 {
u := q[0]
q = q[1:]
for _, v := range adj[u] {
if in_K[v] {
deg[v]--
if deg[v] <= 1 {
in_K[v] = false
q = append(q, v)
}
}
}
}
visited := make([]bool, n+1)
components := [][]int{}
for u := 1; u <= n; u++ {
if !visited[u] {
comp := []int{}
q_bfs := []int{u}
visited[u] = true
for len(q_bfs) > 0 {
v := q_bfs[0]
q_bfs = q_bfs[1:]
comp = append(comp, v)
for _, w := range adj[v] {
if !visited[w] {
visited[w] = true
q_bfs = append(q_bfs, w)
}
}
}
components = append(components, comp)
}
}
F := []int{1}
for _, comp := range components {
has_K := false
for _, u := range comp {
if in_K[u] {
has_K = true
break
}
}
if has_K {
P_C := []int{1}
for _, u := range comp {
if !in_K[u] {
is_adj := false
for _, v := range adj[u] {
if in_K[v] {
is_adj = true
break
}
}
if is_adj {
S_u, W_u, DP_u := solve_tree(u, -1, adj, in_K)
poly_u := make([]int, len(DP_u))
copy(poly_u, DP_u)
for len(poly_u) <= S_u {
poly_u = append(poly_u, 0)
}
poly_u[S_u] = add(poly_u[S_u], W_u)
P_C = poly_mul(P_C, poly_u)
}
}
}
F = poly_mul(F, P_C)
} else {
P_non_empty := make([]int, 0)
for _, v := range comp {
_, _, DP_v := solve_tree(v, -1, adj, in_K)
P_non_empty = poly_add(P_non_empty, DP_v)
}
for i := 0; i < len(comp); i++ {
u := comp[i]
for _, w := range adj[u] {
if u < w {
_, _, DP_u := solve_tree(u, w, adj, in_K)
_, _, DP_w := solve_tree(w, u, adj, in_K)
P_e := poly_mul(DP_u, DP_w)
P_non_empty = poly_sub(P_non_empty, P_e)
}
}
}
W_empty := 0
for _, v := range comp {
_, W_v, _ := solve_tree(v, -1, adj, in_K)
W_empty = add(W_empty, W_v)
}
P_tree := make([]int, len(P_non_empty))
copy(P_tree, P_non_empty)
T_size := len(comp)
for len(P_tree) <= T_size {
P_tree = append(P_tree, 0)
}
P_tree[T_size] = add(P_tree[T_size], W_empty)
F = poly_mul(F, P_tree)
}
}
for k := 0; k <= n; k++ {
ans := 0
if k < len(F) {
ans = mul(F[k], fact[k])
}
fmt.Printf("%d", ans)
if k < n {
fmt.Printf(" ")
}
}
fmt.Println()
}