Cod sursa(job #629910)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 4 noiembrie 2011 09:59:35
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fi ("pairs.in");
ofstream fo ("pairs.out");

const int DIM = 1000010;
char ap[DIM];
int D[DIM], prim[DIM], valmax, N, P, K, X[10];
long long S;

void cit ()
{
	fi >> N;
	for (int i = 1, x; i <= N; i++)
	{	
		fi >> x;
		if (ap[x] == 1)
		{
			i--, N--;
			continue;
		}
		ap[x] = 1;
		valmax = max (valmax, x);
	}	
}

void comb (int k)
{
	if (k - 1 == K)
	{
		if (K & 1)
			S += D[P] * (D[P]-1) / 2;
		else	
			S -= D[P] * (D[P]-1) / 2;
		return;
	}
	
	for (int i = X[k-1]+1; i <= prim[0] && P*prim[i] <= valmax; i++)
	{
		X[k] = i;
		P *= prim[i];
		comb (k + 1);
		P /= prim[i];
	}
}

void ciur ()
{
	int i, j;
	for (i = 2; i <= valmax; i++)
	{
		if (prim[i] == 0)
		{
			prim[++prim[0]] = i;
			for (j = i+i; j <= valmax; j += i)
				prim[j] = 1;
		}
		for (j = i; j <= valmax; j += i)
			D[i] += ap[j];
	}
	
	for (K = 1; K <= 8; K++)
	{
		P = 1;
		comb (1);
	}
}

void afi ()
{
	fo << (long long) N * (N - 1) / 2 - S;
}

int main ()
{
	cit ();
	ciur ();
	afi ();
	return 0;
}