Cod sursa(job #1408315)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 29 martie 2015 23:22:50
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <vector>

#define NMAX 1000001
#define DIM 100001

using namespace std;

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

int n;

vector < pair<int, int> > Q;

bool vis[NMAX], ok[NMAX];

int f[NMAX];

int v[DIM]; 

long long sol;

int main() {

	fin >> n;

	for (int i = 1; i <= n; i++) {

		fin >> v[i];

		vis[v[i]] = 1;

	}

	for (int i = 2; i < NMAX; i++) {

		for (int j = i; j < NMAX; j += i) {

			if (vis[j])
				f[i]++;

		}

	}

	Q.push_back(make_pair(1, 0));

	for (int i = 2; i < NMAX; i++) {

		if (ok[i])
			continue;

		for (int j = i + i; j < NMAX; j += i)
			ok[j] = 1;

		int tempLength = Q.size();

		for (int j = 0; j < tempLength; j++) {

			if (1LL * Q[j].first * i >= NMAX)
				break;

			int divisorsCount = Q[j].second + 1;

			int divisor = Q[j].first * i;

			Q.push_back(make_pair(divisor, divisorsCount));

			if (divisorsCount % 2 == 0)
				sol -= 1LL * (f[divisor] * (f[divisor] - 1)) / 2;

			else
				sol += 1LL * (f[divisor] * (f[divisor] - 1)) / 2;
		
		}
	
	}

	fout << sol << "\n";

	return 0;

}

//Trust me, I'm the Doctor!
//Miriam e tare!