Cod sursa(job #130037)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 30 ianuarie 2008 21:47:18
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<cstdio>
#include<cmath>
long long sol,rez;
int p[80000],x[1000001];
char a[1000001],e[1000001];
int n,X,i,j,k,nr,m,max;
void calcul(){
	for(i=2;i<=max;++i){
		k=max/i;
		for(j=1;j<=k;++j)
			if(a[i*j]) ++x[i];
	}
}
void prim(){
	k=sqrt((double)max);
	for(i=2;i<=k;++i){
		j=i*i;
		while(j<=max){
			e[j]=1;j=j+i;
		}
	}
	for(i=2;i<=max;++i)
		if(!e[i])
			p[++m]=i;
}
void rezolvare(){
	sol=(long long)n*(n-1)/2;
	rez=0;
	for(i=2;i<=max;++i){
		if(x[i]<=1) continue;
		X=i;
		nr=0;
		for(j=1;p[j]<=sqrt((double)X);++j)
			if(X%p[j]==0){
				nr++;
				X=X/p[j];
				if(X%p[j]==0){
					nr=-1;break;
				}
			}
		if(nr==-1) 
			continue;
		nr++;
		if(nr%2) 
			rez+=(long long)x[i]*(x[i]-1)/2;
		else 
			rez-=(long long)x[i]*(x[i]-1)/2;
	}
	sol=sol-rez;
}
int main(){
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",&X);
		a[X]=1;
		if(X>max) max=X;}
	calcul();
	prim();
	rezolvare();
	printf("%lld\n",sol);
	fclose(stdin);
	fclose(stdout);
	return 0;
}