Cod sursa(job #2192806)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 7 aprilie 2018 13:04:30
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#define DM (int) 1e6+1
#include <bitset>
#include <fstream>
#include <vector>
using namespace std;

ifstream fi ("pairs.in");
ofstream fo ("pairs.out");
bitset <DM> bs, v;
int n, a, p[DM], mx;
long long tot;
vector <int> dv;

void pinex()
{
	int bz = (1 << dv.size()) - 1, msk, pr, aux;
	for (msk = 1; msk <= bz; ++msk)
	{
		aux = 1;
		pr = 0;
		for (int vf = 0; vf < dv.size(); ++vf)
			if (msk & (1 << vf))
			{
				aux *= dv[vf];
				++pr;
			}
		if (aux <= mx)
		{
			if (pr&1)
				tot += 1LL*p[aux]*(p[aux] - 1)/2;
			else
				tot -= 1LL*p[aux]*(p[aux] - 1)/2;
		}
	}
}

void ciur()
{
	//vanilla
	bs[1] = 1;
	for (int i = 2; i*i <= mx; ++i)
		if (!bs[i])
			for (int j = i*i; j <= mx; j += i)
				bs[j] = 1;
}

int main()
{
	fi >> n;
	for (int i = 1; i <= n; ++i)
	{
		fi >> a;
		v[a] = 1;
		mx = max(mx, a);
	}
	ciur();
	for (int i = 2; i <= mx; ++i)
	{
		for (int j = 1; j*i <= mx; ++j)
			if (v[i*j])
				++p[i];
		if (!bs[i] && p[i])
			dv.push_back(i);
	}
	pinex();
	fo << n*(n - 1)/2 - tot;
	return 0;
}