Cod sursa(job #918997)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 martie 2013 12:13:34
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 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;
lol sum[NMAX];
vector<int> div;

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

int main()
{
	fin >> n;
	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 - (sum[i] * (sum[i] + 1) / 2);
		else
			sol = sol - (sum[i] * (sum[i] - 1) / 2);
	fout << sol << '\n';
	fout.close();
	return 0;	
}