#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N];
long long f[N];
bool NotPrime[N];
int Prime[N],mu[N],tot;
void sieve(int n){
NotPrime[1]=1;
mu[1]=1;
for(int i=2;i<=n;i++){
if(!NotPrime[i]){
Prime[tot++]=i;
mu[i]=-1;
}
for(int j=0,k;(k=i*Prime[j])<=n;j++){
NotPrime[k]=1;
if(i%Prime[j]==0){
mu[k]=0;
break;
}
mu[k]=-mu[i];
}
}
}
long long pre[N];
int main(){
int q;
scanf("%d",&q);
sieve(100000);
while(q--){
memset(a,0,sizeof a);
memset(f,0,sizeof f);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
a[x]=1;
}
for(int i=1;i<=100000;i++){
if(mu[i]==0)continue;
int cnt=-1;
for(int j=i;j<=100000;j+=i){
cnt+=a[j];
}
for(int j=i;j<=100000;j+=i){
if(a[j])f[j]+=mu[i]*cnt;
}
}
long long ans=0;
for(int i=1;i<=100000;i++){
ans+=f[i]*(n-f[i]-1);
}
ans=(long long)n*(n-1)*(n-2)/6-ans/2;
printf("%lld\n",ans);
}
return 0;
}
将gcd相同的连边
http://acm.hdu.edu.cn/showproblem.php?pid=5072