Cod sursa(job #2313394)

Utilizator livliviLivia Magureanu livlivi Data 6 ianuarie 2019 19:55:09
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#define M 1000000
#define P 7
using namespace std;

ifstream cin("pairs.in");
ofstream cout("pairs.out");

int ciur[M + 1];
vector<int> prime;

void fciur(){
	for(int i = 2; i * i <= M; i++)
		if (ciur[i] == 0)
			for(int j = i * i; j <= M; j += i)
				ciur[j] = 1;

	for(int i = 2; i <= M; i++)
		if (ciur[i] == 0){
			prime.push_back(i);
		}

	// prime.push_back({1, 0});
	// for(int i = 2; i <= M; i++)
	// 	if (ciur[i] == 0){
	// 		int n = prime.size();
	// 		for(int j = 0; j < n && prime[j].first * i <= M; j++)
	// 			prime.push_back({prime[j].first * i, prime[j].second ^ 1});
	// 	}
}

int frecv[M + 1];

void desc(int x){
	vector<int> desc;

	for(int i = 0; i < prime.size() && prime[i] * prime[i] <= x; i++)
		if (x % prime[i] == 0){
			desc.push_back(prime[i]);

			while(x % prime[i] == 0)
				x /= prime[i];
		}

	if (x > 1) desc.push_back(x);

	for(int i = 0; i < (1 << desc.size()); i++){
		int p = 1;
		int cnt = 0;

		for(int j = 0; j < desc.size(); j++)
			if (((1 << j) & i) != 0){
				cnt++;
				p *= desc[j];
			}

		frecv[p]++;
		ciur[p] = cnt;
	}
}

int main(){
	fciur();

	int n; cin >> n;

	for(int i = 0; i < n; i++){
		int x; cin >> x;
		desc(x);
	}

	// cout << frecv[2] << endl;

	long long ans = 0;
	for(int i = 1; i <= M; i++)
		if (frecv[i] > 0){
			// cout << ans << endl;

			if ((ciur[i] & 1) == 0) ans += 1LL * frecv[i] * (frecv[i] - 1) / 2;
			else ans -= 1LL * frecv[i] * (frecv[i] - 1) / 2;
		}

	cout << ans << endl;
	return 0;
}