Cod sursa(job #251954)

Utilizator ProtomanAndrei Purice Protoman Data 3 februarie 2009 17:57:59
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <algorithm>
#include <stdio.h>

#define MAX 1000010

using namespace std;

int n, valMax;
short vctAp[MAX], vctDivPrimi[MAX];

int main()
{
	freopen("pairs.in", "r", stdin);
	freopen("pairs.out", "w", stdout);
	
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
	{
		int elem;
		scanf("%d", &elem);
		vctAp[elem] = 1;

		valMax = max(valMax, elem);
	}

	for (int i = 2; i <= valMax; i++)
		for (int j = i; j <= valMax; j += i)
			vctDivPrimi[j]++;

	long long sol = (long long) n * (n - 1) / 2;

	for (int i = 2; i <= valMax; i++)
	{
		long long nrMult = 0;

		for (int j = i; j <= valMax; j += i)
			nrMult += vctAp[j];

		if (vctDivPrimi[i] & 1)
			sol -= (nrMult - 1) * nrMult / 2;
		else sol += (nrMult - 1) * nrMult / 2;
	}

	printf("%lld", sol);

	fclose(stdin);
	fclose(stdout);
	return 0;
}