Cod sursa(job #2501178)

Utilizator mircearoataMircea Roata Palade mircearoata Data 29 noiembrie 2019 10:26:24
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda simu Marime 0.98 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

int n;
bool f[1000005];
bool ciur[1000005];
long long ans;

vector<int> primes;

int countDiv(int prod)
{
	int cnt = 0;
	for (int i = prod; i <= 1000000; i += prod)
		cnt += f[i];
	return cnt;
}

void back(int prod, int cnt, int last)
{
	if (prod != 1)
	{
		int x = countDiv(prod);
		int per = 1LL * x * (x - 1) / 2;
		if (cnt % 2 == 1)
			per = -per;
		ans += per;
	}
	for (int i = last + 1; i < primes.size(); i++)
		if (1000000 / prod >= primes[i])
			back(prod * primes[i], cnt + 1, i);
}

int main()
{
	in >> n;
	for (int i = 1; i <= n; i++)
	{
		int x;
		in >> x;
		f[x] = 1;
	}
	ans = 1LL * n * (n - 1) / 2;
	for (int i = 2; i * i <= 1000000; i++)
	{
		if (!ciur[i])
		{
			primes.push_back(i);
			for (int j = i * i; j * j <= 1000000; j += i)
				ciur[j] = 1;
		}
	}
	back(1, 0, -1);
	out << ans;
}