/* 題意: 給出n個數(n<100000), 每一個數都不大於100000,數字不會有重複。如今隨意抽出3個,問三個彼此互質 或者 三個彼此不互質的數目有多少。 思路: 這道題反着想,就是三個數中只有一對互質 或者只有兩對互質的個數。 研究後發現 對於每一個數字求出與其不互質的個數k 那麼 sum ( k*(n-1-k) )/2 就是相反的數目, 因此最終的答案就是 C(n,3) - sum ( k*(n-1-k) )/2. */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef __int64 LL; const int maxn=1000; int prime[maxn],flag[maxn],num; int numc[maxn*100+5],f[maxn*100+5]; int factor[20],fac; LL sum; void getprimes() { memset(flag,1,sizeof(flag)); int i,j;num=0; for(i=2;i<maxn;i++) { if(flag[i]) prime[num++]=i; for(j=0;j<num && prime[j]*i<maxn;j++) { flag[prime[j]*i]=0; if(i%prime[j]==0) break; } } } void dfs1(int now,int s)//找出它全部的因子 { if(now==fac) { numc[s]++; return ; } dfs1(now+1,s); dfs1(now+1,s*factor[now]); } void dfs2(int id,int all,int now,int s ) { if(now==all) { sum+=numc[s]; return ; } if(id<fac) { dfs2(id+1,all,now+1,s*factor[id]); dfs2(id+1,all,now,s); } } void getfactors(int n)//分解質因子 { int i;fac=0; for(i=0;i<num && prime[i]<=n;i++) { if(n%prime[i]==0) { factor[fac++]=prime[i]; while(n%prime[i]==0) n/=prime[i]; } } if(n>1) factor[fac++]=n; } int main() { getprimes(); int t,n,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(numc,0,sizeof(numc)); for(i=1;i<=n;i++) { scanf("%d",f+i); getfactors(f[i]); dfs1(0,1); } LL ans=0; for(i=1;i<=n;i++) { getfactors(f[i]); LL ret=1,temp=0; for(j=1;j<=fac;j++)//容斥原理找出與它不互質的個數 { sum=0; dfs2(0,j,0,1); temp+=ret*sum; ret=-ret; } if(temp==0) continue;//當f[i]==1時,全部數都與它不互質的是0個 ans+=(temp-1)*(n-temp); } printf("%I64d\n",(LL)n*(n-1)*(n-2)/6-ans/2); } return 0; }