Cod sursa(job #129950)

Utilizator razvi9Jurca Razvan razvi9 Data 30 ianuarie 2008 18:40:39
Problema Pairs Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<cstdio>
#include<cmath>
long long sol,rez;
int a[1000001],e[1000001],prim[80000],x[1000001];
int n,X,i,j,max,k,nr,m;

void calc(){
	for(i=2;i<=max;i++){
		k=max/i;
		for(j=1;j<=k;j++)
			if(a[i*j]) x[i]++;}}

void prime(){
	k=sqrt(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])prim[++m]=i;}

void solve(){
	sol=(long long)n*(n-1)/2;
	rez=0;
	for(i=2;i<=max;i++){
		if(x[i]<=1) continue;
		X=i;j=1;nr=0;
		for(;prim[j]<=X;j++)
			if(X%prim[j]==0){
				nr++;
				X=X/prim[j];
				if(X%prim[j]==0) {nr=0;break;}}
		if(!nr) continue;
		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;}
 calc();
 prime();
 solve();
 printf("%lld\n",sol);
 fclose(stdout);
 return 0;}