题目链接:Coprime
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 7;
int n, a[maxn], prime[maxn], cnt = 0;
int num[maxn];
vector<int> vec[maxn];
void shuai() {
memset(prime, 0, sizeof prime);
for (int i = 2; i < maxn; i++) {
if (!prime[i])prime[++cnt] = i;
for (int j = 1; j <= cnt; j++) {
if (prime[j] * i >= maxn)break;
prime[prime[j] * i] = 1;
if (i % prime[j] == 0)break;
}
}
}
void fenjie(int x, int pos) {
for (int i = 1; i <= cnt && prime[i] * prime[i] <= x; i++) {
if (x % prime[i] == 0) {
vec[pos].push_back(prime[i]);
while (x % prime[i] == 0)x /= prime[i];
}
}
if (x > 1)vec[pos].push_back(x);
}
void gao() {
for (int i = 1; i < maxn; i++) {
for (int j = i * 2; j < maxn; j += i) {
num[i] += num[j];
}
}
}
int solve(int pos) {
int ans = 0;
int siz = vec[pos].size();
for (int i = 1; i < (1 << siz); i++) {
int kk = 0, chen = 1;
for (int j = 0; j < siz; j++) {
if (i & (1 << j)) {
kk++;
chen *= (vec[pos][j]);
}
}
if (kk & 1) {
ans += num[chen] - 1;
} else ans -= num[chen] - 1;
}
return ans;
}
int main() {
int T;
scanf("%d", &T);
shuai();
while (T--) {
memset(num, 0, sizeof num);
scanf("%d", &n);
ll xxx = 0;
for (int i = 1; i <= n; i++)vec[i].clear();
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
num[a[i]] = 1;
}
gao();
for (int i = 1; i <= n; i++)fenjie(a[i], i);
ll ans = 1ll * n * (n - 1) * (n - 2) / 6;
for (int i = 1; i <= n; i++) {
if (a[i] == 1)continue;
int temp = solve(i);
xxx += 1ll * temp * (n - temp - 1);
}
ans -= xxx / 2;
printf("%lld\n", ans);
}
return 0;
}