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)
}
}
}