Cod sursa(job #1946345)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 30 martie 2017 08:28:44
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <fstream>

using namespace std;

FILE * fin=fopen("pairs.in","r");
FILE * fout=fopen("pairs.out","w");

bool  v[1000005], p[1000005];
int n, maxim, nr, nrprime, prime[100005];

void ciur();
int ok(int x);

int main()
{
	int i, j, x, aux, rez=0;

	fscanf(fin, "%d", &n);
	for (i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &x);
		v[x] = 1;
		if (x > maxim)
			maxim = x;
	}
	ciur();
	for (i = 2; i <= maxim; i++)
	{
		nr = 0;
		for (j = i; j <= maxim; j += i)
			nr += v[j];
		aux = ok(i);
		if (!aux)
			continue;
		if (aux % 2) //
			rez += nr*(nr - 1) / 2;
		else
			rez -= nr*(nr - 1) / 2;
	}
	fprintf(fout, "%d\n", rez);
	return 0;
}

void ciur()
{
	long long i, j;

	prime[++nrprime] = 2;
	for (i = 4; i <= maxim; i += 2)
		p[i] = 1;
	for (i=3;i<=maxim;i++)
		if (!p[i])
		{
			prime[++nrprime] = i;
			for (j = i*i; j <= maxim; j += i)
				p[j] = 1;
		}
}

int ok(int x)
{
	int i, rez=0;

	i = 1;
	while (x > 1)
	{
		if (x%prime[i])
			i++;
		else
		{
			rez++;
			x /= prime[i];
			if (x%prime[i] == 0)
				return 0;
			i++;
		}
	}
	return rez;
}