Cod sursa(job #2304997)

Utilizator flibiaVisanu Cristian flibia Data 18 decembrie 2018 22:29:49
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define ll long long
#pragma GCC optimize("03")

using namespace std;

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

int n, a[100100], st[100], vf, freq[1000100], prim[200100], tp;
ll rs;
bitset <1000100> viz;

int main() {
	for (int i = 2; i * i <= 1000000; i++)
		if (!viz[i]) 
			for (int j = i + i; j <= 1000000; j += i)
				viz[j] = 1;
	for (int i = 2; i <= 1000000; i++)
		if (!viz[i])
			prim[++tp] = i;
	in >> n;
	for (int i = 1; i <= n; i++) 
		in >> a[i];
	for (int i = 1; i <= n; i++) {
		int nr = a[i];
		vf = 0;
		for (int j = 1; prim[j] * prim[j] <= nr; j++) {
			if (nr % prim[j])
				continue;
			st[vf++] = prim[j];
			while (nr % prim[j] == 0)
				nr /= prim[j];
		}
		if (nr > 1)
			st[vf++] = nr;
		for (int mask = 1; mask < (1 << vf); mask++) {
			int num = 1;
			for (int bit = 0; bit < vf; bit++)
				if (mask & (1 << bit))
					num *= st[bit];
			freq[num]++;
		}
	}
	for (int i = 1; i <= n; i++) {
		vf = 0;
		for (int j = 1; prim[j] * prim[j] <= a[i]; j++) {
			if (a[i] % prim[j])
				continue;
			st[vf++] = prim[j];
			while (a[i] % prim[j] == 0)
				a[i] /= prim[j];
		}
		if (a[i] > 1)
			st[vf++] = a[i];
		for (int mask = 1; mask < (1 << vf); mask++) {
			int num = 1, cnt = 0;
			for (int bit = 0; bit < vf; bit++)
				if (mask & (1 << bit)) {
					num *= st[bit];
					cnt++;
				}
			if (cnt & 1)
				rs += freq[num] - 1;
			else rs -= freq[num] - 1;
		}
	}
	out << ((ll) n * ((ll) n - 1LL) - rs) / 2LL;
	return 0;
}