← Home
For problem statement at 0-999/800-899/850-859/859/problemE.txt this is a correct solution, but verifier at 0-999/800-899/850-859/859/verifierE.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)

	scanInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

	if !scanner.Scan() {
		return
	}
	N, _ := strconv.Atoi(scanner.Text())

	parent := make([]int, 2*N+1)
	size := make([]int, 2*N+1)
	edges := make([]int, 2*N+1)
	nextNode := make([]int, 2*N+1)
	active := make([]bool, 2*N+1)

	for i := 1; i <= 2*N; i++ {
		parent[i] = i
		size[i] = 1
	}

	var find func(int) int
	find = func(i int) int {
		if parent[i] == i {
			return i
		}
		parent[i] = find(parent[i])
		return parent[i]
	}

	for i := 0; i < N; i++ {
		u := scanInt()
		v := scanInt()
		active[u] = true
		active[v] = true
		nextNode[u] = v

		rootU := find(u)
		rootV := find(v)
		if rootU != rootV {
			parent[rootU] = rootV
			size[rootV] += size[rootU]
			edges[rootV] += edges[rootU] + 1
		} else {
			edges[rootV]++
		}
	}

	ans := int64(1)
	MOD := int64(1000000007)
	visited := make([]bool, 2*N+1)

	for i := 1; i <= 2*N; i++ {
		if active[i] && parent[i] == i {
			V := int64(size[i])
			E := edges[i]

			if E == size[i]-1 {
				ans = (ans * (V % MOD)) % MOD
			} else if E == size[i] {
				curr := i
				for !visited[curr] {
					visited[curr] = true
					curr = nextNode[curr]
				}
				L := 1
				temp := nextNode[curr]
				for temp != curr {
					L++
					temp = nextNode[temp]
				}
				if L == 1 {
					ans = (ans * 1) % MOD
				} else {
					ans = (ans * 2) % MOD
				}
			}
		}
	}

	fmt.Println(ans)
}