Cod sursa(job #919071)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 martie 2013 12:49:01
Problema Pairs Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

#define NMAX 1000100
#define pb push_back
typedef long long lol;

ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n, rd;
int sum[NMAX];
int pn[NMAX];
bool prime[NMAX];
vector<int> div;

inline void makePrime()
{
	for (int i = 2; i < NMAX; i++)
	{
		if (prime[i] == false)
		{
			for (int j = min(1LL * NMAX, 1LL * i * i); j < NMAX; j += i)
				prime[j] = true;
			pn[++pn[0]] = i;
		}
	}
}

inline void makeDiv(lol number)
{
	div.clear();
	lol d = number;
	for (lol i = 1; pn[i] * pn[i] <= number && d > 1; i++)
	{
		if (d % pn[i] == 0)
		{
			div.pb(pn[i]);
			while (d % pn[i] == 0)
				d /= pn[i];
		}
	}
	if (d > 1) div.pb(d);
}

int main()
{
	fin >> n; makePrime();
	for (int i = 1; i <= n; i++)
	{
		fin >> rd;
		makeDiv(rd);
		int size = div.size();
		
		for (int i = 1; i < (1 << size); i++)
		{
			int num = 1, sign = -1;
			for (int j = 0; j < size; j++)
				if (i & (1 << j))
					num = num * div[j], sign = -sign;
			sum[num] += sign;
		}
	}
	
	lol sol = 1LL * n * (n - 1) / 2;
	for (int i = 2; i < NMAX; i++)
		if (sum[i] < 0)
			sol = sol + (1LL * sum[i] * (sum[i] + 1) / 2);
		else
			sol = sol - (1LL * sum[i] * (sum[i] - 1) / 2);
	fout << sol << '\n';
	fout.close();
	return 0;	
}