← Home
```go
package main

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

const MAXN = 1000010

var mu [MAXN]int

func sieve() {
	var isComposite [MAXN]bool
	var primes []int
	mu[1] = 1
	for i := 2; i < MAXN; i++ {
		if !isComposite[i] {
			primes = append(primes, i)
			mu[i] = -1
		}
		for _, p := range primes {
			if i*p >= MAXN {
				break
			}
			isComposite[i*p] = true
			if i%p == 0 {
				mu[i*p] = 0
				break
			} else {
				mu[i*p] = -mu[i]
			}
		}
	}
}

func main() {
	sieve()
	in := bufio.NewReader(os.Stdin)
	var t int
	fmt.Fscan(in, &t)
	for tt := 0; tt < t; tt++ {
		var n int
		fmt.Fscan(in, &n)
		a := make([]int, n)
		for i := 0; i < n; i++ {
			fmt.Fscan(in, &a[i])
		}
		cnt := make([]int64, n+1)
		for i := 0; i < n; i++ {
			cnt[a[i]]++
		}
		if cnt[1] > 0 {
			fmt.Println(0)
			continue
		}
		f := make([]int64, n+1)
		for m := 1; m <= n; m++ {
			for j := m; j <= n; j += m {
				f[m] += cnt[j]
			}
		}
		qual := make([]bool, n+1)
		for i := 0; i <= n; i++ {
			qual[i] = true
		}
		for s := 1; s <= n; s++ {
			if cnt[s] > 0 {
				for mult := s; mult <= n; mult += s {
					qual[mult] = false
				}
			}
		}
		var ans int64 = 0
		for g := 1; g <= n; g++ {
			if !qual[g] {
				continue
			}
			var sum int64 = 0
			for k := 1; ; k++ {
				gk64 := int64(g) * int64(k)
				if gk64 > int64(n) {
					break
				}
				gk := int(gk64)
				bino := f[gk] * (f[gk] - 1) / 2
				sum += int64(mu[k]) * bino
			}
			ans += sum
		}
		fmt.Println(ans)
	}
}
```