Cod sursa(job #199509)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 19 iulie 2008 00:26:07
Problema Pairs Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#define IN "pairs.in"
#define OUT "pairs.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<17
#define M_MAX 1<<20
#define SQRT 1<<10
#define LL long long

int max,N;
LL rez;
int nrpr[SQRT],V[N_MAX];
bool pr[SQRT],bo[M_MAX];


void ciur()
{
	FOR(i,2,SQRT)
	{
		if(pr[i])
			continue;
		nrpr[ ++nrpr[0] ] =i;
		for(int j=i*i;j<=SQRT;j+=i)
			pr[j] = 1;
	}
}
	
void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d", &N);
	FOR(i,1,N)
	{
		scanf("%d", &V[i]);
		if(V[i] > max)
			max = V[i];
		bo[ V[i] ] = 1;
 	}	
}

void solve()
{
	FOR(i,2,max)
	{
		int nr=0,ok=1,aux=i,nrdiv=0;
		for(int j=1;j<= nrpr[0] && ok && nrpr[j] * nrpr[j] <= aux;++j)
			if(!(aux % nrpr[j]))
			{
				aux /= nrpr[j];
				++nrdiv;
				if(!(aux % nrpr[j]))
					ok=0;
			}
		
		if(!ok)	
			continue;	
		if(aux>1)
			++nrdiv;
		
		for(int j=i;j<=max;j+=i)
			if(bo[ j ])
				++nr;
		if(nrdiv & 1)
			rez += (LL) nr * (nr-1) / 2;
		else
			rez -= (LL) nr * (nr-1) / 2;
	}	
	
	printf("%lld\n", (LL) (N * (N-1) / 2) - rez); 
	
}

int main()
{
	scan();
	ciur();
	solve();
	return 0;
}