Cod sursa(job #251977)

Utilizator ProtomanAndrei Purice Protoman Data 3 februarie 2009 18:29:07
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <algorithm>
#include <stdio.h>

#define MAX 1000010

using namespace std;

int n, valMax;
short vctAp[MAX], vctDivPrimi[MAX];
int vctNrForm[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 = 1; i <= valMax; vctNrForm[i] = 1, i++);

	for (int i = 2; i <= valMax; i++)
		for (int j = i; j <= valMax; j += i)
		{
			vctDivPrimi[j]++;
			vctNrForm[j] *= i;
		}

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

	for (int i = 2; i <= valMax; i++)
		if (vctNrForm[i] == 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;
}