Coprime

#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

posted @ 2020-06-07 21:09  Reimu222  阅读(348)  评论(0)    收藏  举报