Cod sursa(job #921104)

Utilizator vld7Campeanu Vlad vld7 Data 20 martie 2013 19:42:25
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>

using namespace std;

ifstream f("pairs.in");
ofstream g("pairs.out");

const int MAX_N = 100005;
const int MAX_VAL = 1000000;

int n, a[MAX_N], prim[MAX_VAL], X[MAX_VAL];
long long rez;
bool frecv[MAX_VAL], bad[MAX_VAL];

void ciur() {
	for (int i = 2; i <= MAX_VAL; i++)
		if (prim[i] == 0)	// e prim
			for (int j = i; j <= MAX_VAL; j += i)
				prim[j]++;
}

void read() {
	f >> n;
	for (int i = 1; i <= n; i++) {
		f >> a[i];
		frecv[a[i]] = 1;
	}
}

void solve() {
	for (int i = 2; i * i <= MAX_VAL; i++)
		if (prim[i] == 1) {	
			for (int j = i * i; j <= MAX_VAL; j += i * i)	// merg din i^2 in 2 * i^2 in 3 * i^2
				bad[j] = 1;
		}
		
	for (int i = 2; i <= MAX_VAL; i++)
		if (!bad[i]) {	// daca i e produs de numere prime care apar doar o data
			for (int j = i; j <= MAX_VAL; j++)
				if (frecv[j])
					X[i]++;		// X[i] = numarul de numere din M divizibile cu i
		}
				
	for (int i = 2; i <= MAX_VAL; i++)
		if (prim[i] % 2 == 0)
			rez = rez - 1LL * X[i] * (X[i] - 1) / 2;
		else
			rez = rez + 1LL * X[i] * (X[i] - 1) / 2;
		
	rez = 1LL * n * (n - 1) / 2 - rez;
}

int main() {
	ciur();
	read();
	solve();
	
	g << rez << '\n';
	
	f.close();
	g.close();
	
	return 0;
}