← Home
For problem statement at 2000-2999/2100-2199/2130-2139/2131/problemH.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2130-2139/2131/verifierH.go ends with All 14 tests passed. can you fix the verifier? package main

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

var min_prime [1000005]int32
var primes []int32
var cnt [1000005]int32

func sieve() {
	for i := int32(2); i <= 1000000; i++ {
		if min_prime[i] == 0 {
			min_prime[i] = i
			primes = append(primes, i)
		}
		for _, p := range primes {
			if i*p > 1000000 {
				break
			}
			min_prime[i*p] = p
			if i%p == 0 {
				break
			}
		}
	}
}

func get_prime_factors(x int32, factors *[8]int32) int {
	k := 0
	for x > 1 {
		p := min_prime[x]
		factors[k] = p
		k++
		for x%p == 0 {
			x /= p
		}
	}
	return k
}

func count_coprimes(x int32) int32 {
	var factors [8]int32
	k := get_prime_factors(x, &factors)
	num := 1 << k
	res := int32(0)
	for mask := 0; mask < num; mask++ {
		d := int32(1)
		mu := int32(1)
		for i := 0; i < k; i++ {
			if (mask & (1 << i)) != 0 {
				d *= factors[i]
				mu = -mu
			}
		}
		if mu == 1 {
			res += cnt[d]
		} else {
			res -= cnt[d]
		}
	}
	return res
}

func add_elem(x int32, delta int32) {
	var factors [8]int32
	k := get_prime_factors(x, &factors)
	num := 1 << k
	for mask := 0; mask < num; mask++ {
		d := int32(1)
		for i := 0; i < k; i++ {
			if (mask & (1 << i)) != 0 {
				d *= factors[i]
			}
		}
		cnt[d] += delta
	}
}

func gcd(a, b int32) int32 {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

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

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	readInt := func() int32 {
		if !scanner.Scan() {
			return 0
		}
		res := int32(0)
		for _, c := range scanner.Bytes() {
			res = res*10 + int32(c-'0')
		}
		return res
	}

	t := readInt()
	for tc := int32(0); tc < t; tc++ {
		n := readInt()
		_ = readInt() // skip m

		a := make([]int32, n+1)
		for i := int32(1); i <= n; i++ {
			a[i] = readInt()
		}

		u, v := int32(-1), int32(-1)
		var history []int32

		for i := int32(1); i <= n; i++ {
			c := count_coprimes(a[i])
			if c > 0 {
				v = i
				break
			}
			add_elem(a[i], 1)
			history = append(history, a[i])
		}

		if v != -1 {
			for j := int32(1); j < v; j++ {
				if gcd(a[j], a[v]) == 1 {
					u = j
					break
				}
			}
		}

		for _, x := range history {
			add_elem(x, -1)
		}

		if v == -1 {
			fmt.Fprintln(out, 0)
			continue
		}

		history = history[:0]
		r, s := int32(-1), int32(-1)
		for i := int32(1); i <= n; i++ {
			if i == u || i == v {
				continue
			}
			c := count_coprimes(a[i])
			if c > 0 {
				s = i
				break
			}
			add_elem(a[i], 1)
			history = append(history, a[i])
		}

		if s != -1 {
			for j := int32(1); j < s; j++ {
				if j == u || j == v {
					continue
				}
				if gcd(a[j], a[s]) == 1 {
					r = j
					break
				}
			}
		}

		for _, x := range history {
			add_elem(x, -1)
		}

		if s != -1 {
			fmt.Fprintln(out, u, v, r, s)
			continue
		}

		var Su, Sv []int32
		for i := int32(1); i <= n; i++ {
			if i == u || i == v {
				continue
			}
			if gcd(a[u], a[i]) == 1 {
				Su = append(Su, i)
			}
			if gcd(a[v], a[i]) == 1 {
				Sv = append(Sv, i)
			}
		}

		found := false
		if len(Su) > 0 && len(Sv) > 0 {
			x1 := Su[0]
			y1 := Sv[0]
			if x1 != y1 {
				fmt.Fprintln(out, u, x1, v, y1)
				found = true
			} else {
				if len(Su) > 1 {
					fmt.Fprintln(out, u, Su[1], v, y1)
					found = true
				} else if len(Sv) > 1 {
					fmt.Fprintln(out, u, x1, v, Sv[1])
					found = true
				}
			}
		}

		if !found {
			fmt.Fprintln(out, 0)
		}
	}
}