Cod sursa(job #494876)

Utilizator darrenRares Buhai darren Data 23 octombrie 2010 11:40:26
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>
#include <algorithm>

using namespace std;

int N;
int V[200002], divX[1000002];
int Max;
bool is[1000002], prim[1000002], facP[1000002], can[1000002]; // facP - ma folosesc de overflow.
long long tot;

int main()
{
	ifstream fin("pairs.in");
	ofstream fout("pairs.out");

	fin >> N;
	for (int i = 1; i <= N; ++i)
	{
		fin >> V[i];
		is[V[i]] = true;
		Max = max(Max, V[i]);
	}

	divX[1] = N;
	for (int i = 2; i <= Max; ++i)
	{
		divX[i] = is[i];
		for (int j = 2; i * j <= Max; ++j)
			divX[i] += is[i * j];

		if (!prim[i])
		{
			++facP[i];

			for (int j = 2; i * j <= Max; ++j)
			{
				prim[i * j] = true;
				++facP[i * j];

				can[i * j] |= (j % i == 0);
			}
		}
	}

	for (int i = 2; i <= Max; ++i)
		if (can[i] == false)
			tot += (facP[i] == true ? 1 : -1) * (long long) divX[i] * (long long) (divX[i] - 1) / 2;

	long long sol = (long long) N * (N - 1) / 2;

	fout << sol - tot;

	fin.close();
	fout.close();
}