Cod sursa(job #995836)

Utilizator cont_de_testeCont Teste cont_de_teste Data 10 septembrie 2013 12:41:46
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("pairs.in");

#ifdef INFOARENA
	ofstream fout("pairs.out");
#else
	#define fout cout
#endif

const int MAX_N = 100005;
const int MAX_V = 16;

int n;
int apr[MAX_V];

int a[MAX_N];
bool prime[MAX_V];
int good[MAX_V];

int dvs[MAX_V];
long long soln;


void read() {
	fin >> n;
	for (int i = 1; i <= n; ++i) {
		fin >> a[i];
		++apr[a[i]];
	}
	fin.close();
}


void make_pr() {
	for (int i = 2; i < MAX_V; ++i) {
		dvs[i] += apr[i];
		if (!prime[i]) {
			good[i] = 1;
			for (int j = i + i; j < MAX_V; j += i) {
				prime[j] = true;
				if ( (j / i) % i ) {
					++good[j];
				} else {
					good[j] = -MAX_V;
				}
				dvs[i] += apr[j];
			}
		}
	}
}


void solve() {
	soln = 1LL * n * (n - 1) / 2LL;
	for (int i = 2; i <= MAX_V; ++i) {
		if (good[i] > 0) {
			if (good[i] % 2) {
				soln -= 1LL * dvs[i] * (dvs[i] - 1) / 2LL;
			} else {
				soln += 1LL * dvs[i] * (dvs[i] - 1) / 2LL;
			}
		}
	}
}


void write() {
	fout << soln << '\n';
#ifdef INFOARENA
	fin.close();
#endif
}


int main() {
	read();
	make_pr();
	solve();
	write();
}