Cod sursa(job #629636)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 3 noiembrie 2011 16:27:24
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <vector>
using namespace std;

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

const int DIM = 1000005;
vector <int> V[DIM];
bool ap[DIM], ciurv[DIM];
int D[DIM], valmax, N;
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 ciur ()
{
	int i, j, x;
	for (i = 2; i <= valmax; i++)
	{
		for (j = i; j <= valmax; j += i)
		{
			D[i] += ap[j];
			ciurv[j] = 1;
			if (i == j)
				ciurv[i] = 0;
			if (ciurv[i] == 0)
				V[j].push_back (i);
		}
		
		x = i;
		for (j = 0; j < V[i].size(); j++)
			x /= V[i][j];
		while ( !V[i].empty () )
			V[i].pop_back ();
		if (x != 1)
			continue;
		
		x = (long long) D[i] * (D[i] - 1) / 2;
		if (j & 1)
			S += x;
		else
			S -= x;				
	}
}

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

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