Cod sursa(job #2305005)

Utilizator flibiaVisanu Cristian flibia Data 18 decembrie 2018 22:39:22
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 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;

void mark(int lvl, int prod) {
	if (lvl == vf) {
		freq[prod]++;
		return;
	}
	mark(lvl + 1, prod * st[lvl]);
	mark(lvl + 1, prod);
}

void back(int lvl, int prod, int f) {
	if (lvl == vf) {
		if (!f)
			return;
		if (f)
			rs += freq[prod] - 1;
		else rs -= freq[prod] - 1;
		return;
	}
	back(lvl + 1, prod * st[lvl], f + 1);
	back(lvl + 1, prod, f);
}

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;
		mark(0, 1);
	}
	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];
		back(0, 1, 0);
	}
	out << ((ll) n * ((ll) n - 1LL) - rs) / 2LL;
	return 0;
}