Cod sursa(job #130034)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 30 ianuarie 2008 21:40:07
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>
#include<math.h>
char a[1000000],e[1000000];
int n,t,y,i,j,k,nr,m,max,p[80000],x[1000000];
long long sol,rez;
void calcul(){   // calculul
    for(i=2;i<=max;++i){
        k=max/i;
        for(j=1;j<=k;++j)
            if(a[j*i]!=0)
				++x[i];
	}
}
void prim(){   //operatia de prime intre ele
    k=sqrt((double)max);
    for(i=2;i<=k;++i){
        j=i*i;
        while(max>=j){
			e[j]=1;
			j+=i;
		}
	}
    for(i=2;i<=max;++i)
        if(!e[i])
			p[++m]=i;
}
void rezolv(){   //ecuatia
    sol=(long long)n*(n-1)/2;
    rez=0;
    for(i=2;i<=max;++i){
        if(x[i]<=1)
			continue;
        t=i;
		nr=0;
		y=sqrt((double)t);
        for(j=1;p[j]<=y;++j)
            if(t%p[j]==0){
                nr++;
                t/=p[j];
                if(t%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-=rez;
}
int main(){
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",&t);
		a[t]=1;
		if(t>max)
			max=t;
	}
	calcul();
	prim();
	rezolv();
	printf("%lld",sol);
	fclose(stdin);
	fclose(stdout);
	return 0;
}